Автор Тема: быстрое чтение файла  (Прочитано 8192 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
быстрое чтение файла
« : 22 Декабря 2004, 16:01:01 »
какой из вариантов более приемлемый:
скриптик должен открывать файл и искать в нем нужный номер $idold. все остальные сообщения вывести.
Предполагается что в файле будет записей не больше 30, но запрос на его вызов будет 30 раз в сек.

open (LIST,"chat_list.tmp");
flock(LIST, LOCK_SH);
while () {
   ($id,$time,$fromuser,$touser,$mess)=split(/\\|/);
   if ($id>$idold) { print "$id,$time,$fromuser,$touser,$mess\\n"; }
}
close(LIST);


или


open (LIST,"chat_list.tmp");
flock(LIST, LOCK_SH);
@list=;
close(LIST);
($id,$time,$fromuser,$touser,$mess)=split(/\\|/, $list[0]);
if ($id<$idold) { $idnew=$idold-$id; }# высчитали с какой строчки выводить
else { $idnew=0; }
foreach $idnew (@list) {
   ($id,$time,$fromuser,$touser,$mess)=split(/\\|/, $list[$idnew]);
   print "$id,$time,$fromuser,$touser,$mess\\n";
   $idnew++;
}


может я вообще перехимичил?
« Последнее редактирование: 22 Декабря 2004, 18:34:22 от Yaroslav »
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
быстрое чтение файла
« Ответ #1 : 22 Декабря 2004, 16:17:06 »
Визуально первый предпочтительнее, хотябы только потому что не идет считывание всего фала в лишний массив.
perldoc Benchmark
The documentations is your friend

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
быстрое чтение файла
« Ответ #2 : 22 Декабря 2004, 16:41:04 »
($id,$_,$_,$_,$_)=split(/\\|/);

Это новый стиль программирования на перл? Я имею в виду использование магической $_?
There Is More Than One Way To Do It (c)

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
быстрое чтение файла
« Ответ #3 : 22 Декабря 2004, 16:42:40 »
Цитировать
2NetFly:
Это новый стиль программирования на перл? Я имею в виду использование магической $_?

это что б е забивать голову вам и было наглядней :)
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
быстрое чтение файла
« Ответ #4 : 22 Декабря 2004, 16:53:07 »
Перлдок не рекомендует явное присваивание магическим переменным, особенно $_. Это может стать причиной сложно обнаруживаемых ошибок.
There Is More Than One Way To Do It (c)

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
быстрое чтение файла
« Ответ #5 : 22 Декабря 2004, 16:59:56 »
Цитировать
2NetFly:
Перлдок не рекомендует явное присваивание магическим переменным, особенно $_. Это может стать причиной сложно обнаруживаемых ошибок.

я же говорю, это я для вас сделал :)
кстати, раз уж тут поднялся этот вопрос. а что есть альтернатива $_ ?

вопрос о скорости и вариантах остается открытым.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
быстрое чтение файла
« Ответ #6 : 22 Декабря 2004, 17:12:14 »
Что значит альтернатива?

А касательно скорости NeoNox уже ответил. Первый вариант правильнее, т.к. ты работаешь только с текущей строкой файла. Считывать в массив весь файл - это лишние, в данном случае ненужные, телодвижения.
« Последнее редактирование: 22 Декабря 2004, 17:40:42 от 2NetFly »
There Is More Than One Way To Do It (c)

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
быстрое чтение файла
« Ответ #7 : 22 Декабря 2004, 17:41:12 »
Цитировать
Yaroslav:
вопрос о скорости и вариантах остается открытым.

во втором примере (правда не меняет \'|\' на запятую - может просто сразу в файл писать разделитель запятую)

open (LIST,"chat_list.tmp");
flock(LIST, LOCK_SH);
@list=;
close(LIST);
($id,undef,undef,undef,undef)=split(/\\|/, $list[0]);
if ($id<$idold) { $idnew=$idold-$id; else { $idnew=0; }
my @spisok = map {s/^\\d+?\\|//&&$_} @list[$idnew..$#list];

ээ :) а если забить на удаление id, то просто выводи
 @list[$idnew..$#list]; - самый быстрый вариант
« Последнее редактирование: 22 Декабря 2004, 17:47:50 от Green Kakadu »
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
быстрое чтение файла
« Ответ #8 : 22 Декабря 2004, 17:46:39 »
Цитировать
2NetFly:
А касательно скорости NeoNox уже ответил.

вопрос спорный, т.к. в первом случае идет проверка для каждой строки

 if ($id>$idold)
и при этом все равно перебирается весь массив
 в исканиях.

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
быстрое чтение файла
« Ответ #9 : 22 Декабря 2004, 17:55:10 »
Цитировать
Green Kakadu:
во втором примере (правда не меняет \'|\' на запятую - может просто сразу в файл писать разделитель запятую)
my @spisok = map {s/^\\d+?\\|//&&$_} @list[$idnew..$#list];

немножко не то...
мне потом этот @spisok разделить надо будет на ($id,$_,$_,$_,$_)=(номер, дата, от кого, кому, сообщение)
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
быстрое чтение файла
« Ответ #10 : 22 Декабря 2004, 17:55:15 »
Цитировать

($id,undef,undef,undef,undef)=split(/\\|/, $list[0]);

Эм, а undef зачем? =)

($id) = split(/\\|/, $list[0]);
или так
$id = (split /\\|/, $list[0])[0];

А вообще, я что-то с трудом понимаю, что делает код, описанный в перовом посте. Особенно, то место, где в @spisok добавляется много-много $_ ;=)
There Is More Than One Way To Do It (c)

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
быстрое чтение файла
« Ответ #11 : 22 Декабря 2004, 18:02:15 »
Если ты хочешь, чтоб тебе помогли, опиши рабочий код, а не специально "для нас" испорченный. Ну не будет у тебя работать конструкция:
($id,$_,$_,$_,$_)=(номер, дата, от кого, кому, сообщение)
В данном случае, в $_ окажется сообщение, а push (@spisok,"$_,$_,$_,$_") добавит в список не то, что ты хотел.
There Is More Than One Way To Do It (c)

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
быстрое чтение файла
« Ответ #12 : 22 Декабря 2004, 18:05:03 »
Цитировать
Yaroslav:
мне потом этот @spisok разделить надо будет на ($id,$_,$_,$_,$_)=(номер, дата, от кого, кому, сообщение)

ээ, так в каком формате должна быть строка в @spisok с id или без него?
если вопрос в том чтоб из "|" сделать ","
то
my @spisok =map {tr/\\|/,/&&$_} @list[$idnew..$#list];
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
быстрое чтение файла
« Ответ #13 : 22 Декабря 2004, 18:06:43 »
Цитировать
2NetFly:
Если ты хочешь, чтоб тебе помогли, опиши рабочий код, а не специально "для нас" испорченный.

это наверное чтоб мы гениальный замысел программы не прознали
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
быстрое чтение файла
« Ответ #14 : 22 Декабря 2004, 18:11:00 »
Цитировать
Yaroslav:
но запрос на его вызов будет 30 раз в сек.

нехилая частота. а как часто он будет обновляться?
может имеет смысл убрать flock?
 в исканиях.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28