Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прошу разъяснить - кэширование и блокирование, как работает кэширование и блокирование 
:(
    Опции темы
Uran34
Дата 3.12.2010, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



Посмотрите вложеные текстовые файлы. Есть некий файл со строками ($filename). Используя процедуры
упаковки в индекс-файл и определения по номеру индекса номера строки файла (build_index и line_with_index) находим нужную строку файла. Это все понятно. Далее предлагается использовать 
кэширование, чтобы индекс-файл не строился каждый раз снова, а, как я понимаю, находился 
в оперативной памяти и затребывался бы оттуда. И последнее. Чтобы два или более пользователя, обратясь одновременно к этой программе не вызвали бы конфликтной ситуации в ее работе предлагается установить
блокировку двойного вызова процедуры создание индекс-файла. 

Индексирование у меня получается. Файл строится и нужная строка определяется.
Вопрос: пожалуйста, объясните, КАК это работает. Не могу ничего понять с кэшированием и блокировкой.

Пишу эту строку: @ARGV = = 2 or die "usage: print_line FILENAME LINE_NUMBER"; ($filename, $line_number) = @ARGV; и получаю всегда: "usage: print_line FILENAME LINE_NUMBER". Откуда в этих примерах берется число аргументов равное 2?
Что это за переменные $orig, $idx Откуда они взялись, их нет в build_index и line_with_index! smile 

Вообщем, в этих примерах что-то такое обобщеное, условное. Как правильно сделать кэширование и блокирование?

Добавлено через 1 минуту и 7 секунд
Файлы вот

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  8_10.txt 0,32 Kb
PM MAIL   Вверх
Uran34
Дата 3.12.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



и вот

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  8_11.txt 0,85 Kb
PM MAIL   Вверх
Uran34
Дата 3.12.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



и еще вот

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  8_12.txt 1,00 Kb
PM MAIL   Вверх
DurRandir
Дата 3.12.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Google it
PM   Вверх
arto
Дата 4.12.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



что вы понимаете под "кешированием" и "блокированием"?
PM MAIL ICQ   Вверх
alezzz
Дата 4.12.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Цитата(Uran34 @  3.12.2010,  21:39 Найти цитируемый пост)
Пишу эту строку: @ARGV = = 2 or die "usage: print_line FILENAME LINE_NUMBER"; ($filename, $line_number) = @ARGV; и получаю всегда: "usage: print_line FILENAME LINE_NUMBER". Откуда в этих примерах берется число аргументов равное 2?Что это за переменные $orig, $idx Откуда они взялись, их нет в build_index и line_with_index!  



@ARGV обсуждался тут, при вызове программы дайте ей 2 аргумента. Вот только непонятно @ARGV = = 2. Тут что, между знаками равно пробел стоит? syntax error на это выскакивает.

Это сообщение отредактировал(а) alezzz - 4.12.2010, 14:24
PM MAIL   Вверх
Uran34
Дата 4.12.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



Цитата(arto @  4.12.2010,  11:03 Найти цитируемый пост)
что вы понимаете под "кешированием" и "блокированием"? 




Цитата(Uran34 @  3.12.2010,  21:39 Найти цитируемый пост)
...предлагается использовать 
кэширование, чтобы индекс-файл не строился каждый раз снова, а, как я понимаю, находился 
в оперативной памяти и затребывался бы оттуда. И последнее. Чтобы два или более пользователя, обратясь одновременно к этой программе не вызвали бы конфликтной ситуации в ее работе предлагается установить
блокировку двойного вызова процедуры создание индекс-файла. 


А что такое кэширование и блокирование на самом деле?

Добавлено через 6 минут и 29 секунд
Цитата(alezzz @  4.12.2010,  14:18 Найти цитируемый пост)
при вызове программы дайте ей 2 аргумента.

А если я не работаю с командной строкой?
Вариант первый: я вызываю программу в редакторе (использую Perl Express) нажатием кнопки Play. Как здесь дать ей 2 аргумента?
Вариант второй: я вызываю программу браузером с апача. Как здесь задать два агрумента?
 
Цитата(alezzz @  4.12.2010,  14:18 Найти цитируемый пост)
Вот только непонятно @ARGV = = 2. Тут что, между знаками равно пробел стоит? syntax error на это выскакивает.

Думаю что это просто опечатка.

Добавлено через 8 минут и 3 секунды
Цитата(DurRandir @  3.12.2010,  23:00 Найти цитируемый пост)
Google it 

 неплохой совет. В результате  я, кстати, нашел этот форум.

Добавлено через 9 минут и 54 секунды
Может кто-нибудь просто толково и доходчиво объяснить как работают эти примеры?
PM MAIL   Вверх
arto
Дата 4.12.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



на лекции надо было ходить регулярно.
PM MAIL ICQ   Вверх
shamber
Дата 5.12.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(Uran34 @  4.12.2010,  18:45 Найти цитируемый пост)
Вариант второй: я вызываю программу браузером с апача. Как здесь задать два агрумента?

переписать для CGI?
PM MAIL Jabber   Вверх
alezzz
Дата 5.12.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Цитата(Uran34 @  4.12.2010,  18:45 Найти цитируемый пост)
Цитата(alezzz @  4.12.2010,  14:18 )при вызове программы дайте ей 2 аргумента.А если я не работаю с командной строкой?Вариант первый: я вызываю программу в редакторе (использую Perl Express) нажатием кнопки Play. Как здесь дать ей 2 аргумента?Вариант второй: я вызываю программу браузером с апача. Как здесь задать два агрумента?


C Perl Express не работал, под Windows у меня Absolute Perl. Там это делается так:
user posted image
В результате "test.txt" попадает в @ARGV. Что-то подобное должно быть и Perl Express.

Про второй вариант shamber ответил. Любая документация по CGI должна помочь.


Цитата

Что это за переменные $orig, $idx Откуда они взялись, их нет в build_index и line_with_index! 


Они есть в основной программе, файл 8_12. Дескрипторы файла данных и файла индексов. В build_index и line_with_index приходят как параметры функции.


Это сообщение отредактировал(а) alezzz - 5.12.2010, 16:22
PM MAIL   Вверх
Uran34
Дата 5.12.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



alezzz, спасибо. Кое-что проясняется.
Открыл один из присоединенных мною ранее файлов и увидел, что там комментарии искажены.
Попробую по-другому их представить, может быть это более разъяснит суть моего вопроса.

Пример 8.10
Код

# Применение : build_index(*МАНИПУЛЯТОР_ДАННЫХ, *МАНИПУЛЯТОР_ИНДЕКСА)
sub build_index {
    my $data_file  = shift;
    my $index_file = shift;
    my $offset     = 0;
  
    while (<$data_file>) {
        print $index_file pack("N", $offset);
        $offset = tell($data_file);
    }
}


Пример 8.11
Код

# Применение : line_with_index(*МАНИПУЛЯТОР_ДАННЫХ,
#                              *МАНИПУЛЯТОР_ИНДЕКСА,
#                              $НОМЕР_СТРОКИ)
# Возвращает строку или undef, если НОМЕР_СТРОКИ выходит за пределы файла
sub line_with_index {
    my $data_file   = shift;
    my $index_file  = shift;
    my $line_number = shift;
    my $size;               # Размер элемента индекса
    my $i_offset;           # Смещение элемента в индексе
    my $entry;              # Элемент индекса
    my $d_offset;           # Смещение в файле данных
    $size = length(pack("N", 0));
    $i_offset = $size * ($line_number-1);
    seek($index_file, $i_offset, 0) or return;
    read($index_file, $entry, $size);
    $d_offset = unpack("N", $entry);
    seek($data_file, $d_offset, 0);
    return scalar(<$data_file>);


Пример 8.12
Код

 #!/usr/bin/perl -w
 # cache_line_index - кэширование индекса
 # Использует процедуры build_index и line_with_index (см. примеры 8.10, 8.11)
 @ARGV =  = 2 or
     die "usage: print_line FILENAME LINE_NUMBER";
 
 ($filename, $line_number) = @ARGV;
 open(my $orig, "<", $filename) 
         or die "Can't open $filename for reading: $!";
 
 # Открыть индекс и построить его при необходимости.
 # Здесь возникает потенциальная опасность перехвата: две копии
 # программы могут одновременно определить, что индекс для данного
 # файла не существует, и попытаться построить его.
 # Проблема легко решается блокировкой.
 $indexname = "$filename.index";
 sysopen(my $idx, $indexname, O_CREAT|O_RDWR)
          or die "Can't open $indexname for read/write: $!";
 build_index($orig, $idx) if -z $indexname;  # XXX: race unless lock
 
 $line = line_with_index($orig, $idx, $line_number);
 die "Didn't find line $line_number in $filename" unless defined $line;
 print $line;



Добавлено через 10 минут и 45 секунд
Вот что не могу понять. В какой части примера 8.12 находится конструкция кэширования, а в какой блокирования? Правильно ли понимаю: при зпауске программы происходит передача двух аргументов (дескриптор файла данных и дескриптор файла индекса). Если их количество превышает 2, из-за запуска программы более чем одним пользователем, выдается сообщение об ошибке. Но причем здесь кэширование? Это блокирование же! А кэширование в нижней части кода!

Это сообщение отредактировал(а) Uran34 - 5.12.2010, 19:09
PM MAIL   Вверх
shamber
Дата 5.12.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(Uran34 @  5.12.2010,  19:07 Найти цитируемый пост)
Правильно ли понимаю: при зпауске программы происходит передача двух аргументов (дескриптор файла данных и дескриптор файла индекса). Если их количество превышает 2, из-за запуска программы более чем одним пользователем, выдается сообщение об ошибке.

нет не правильно понимаете, вот на счет блокировки правильно.

Добавлено через 1 минуту и 45 секунд
А кэширование в 
Цитата(Uran34 @  5.12.2010,  19:07 Найти цитируемый пост)
 # Открыть индекс и построить его при необходимости.


PM MAIL Jabber   Вверх
Uran34
Дата 7.12.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.11.2010

Репутация: нет
Всего: нет



Да,  теперь понятно! Спасибо!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.