Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение только одной строки из большого файла 
V
    Опции темы
sTa1kEr
Дата 13.8.2007, 23:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Цитата(Antarn @  13.8.2007,  21:30 Найти цитируемый пост)
Mal Hack, можно дать линк с простейшим примером использования потоков при работе с файлами ?

То что имел ввиду Mal Hack, осуществляется через раширение dio. Простейший пример чтения рандомной строки
Код

function rand_line($filename)
{
   if (!file_exists($filename)) return false;
   $size = filesize($filename);
   $fp = dio_open($filename, O_RDONLY);
   $pos = rand(0, $size);
   dio_seek($fp, $pos, SEEK_SET);
   while ($pos > 0 && dio_read($fp, 1) != "\n") dio_seek($fp, --$pos, SEEK_SET);
   $line = "";
   while(($b = dio_read($fp, 1)) != "\n" && $b !== null) $line .= $b;
   dio_close($fp);
   return $line;
}

echo rand_line("test.txt");


Это сообщение отредактировал(а) sTa1kEr - 13.8.2007, 23:13
PM MAIL   Вверх
sTa1kEr
Дата 13.8.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Цитата(Mal Hack @  13.8.2007,  22:29 Найти цитируемый пост)
Раньше такого точно не могло быть. 100%. Тестировал я большие файлы... Точно помню на 4 было так, как в сях.

Сейчас протестировал в Windows. Что бы не писать слишком сложных скриптов, проверял через Task Manager. Файл чуть больше 20мб.
Код

$fp = fopen("stuff.txt", "r");
$size = filesize("stuff.txt");
for ($i = 0; $i < 10000; $i++)
{
   fseek($fp, rand(0, $size), SEEK_SET);
   fread($fp, 1);
}
fclose($fp);
sleep(100);

И аналогичный, но через dio.
Через dio, как и ожидалось, все идеально, ни байта лишней памяти, ни одного лишнего обращения к диску. Через fopen, процесс PHP прочел с диска > 80мб данных, а вот памяти сам PHP не съел ни одного лишнего байта, но система съедала где-то еще 4мб, т.е. такое впечатление, что она просто не успевала освобождать память. Если, к примеру, в цикл вставить usleep(100), то же лишняя память не расходовалась. Проверял и на PHP 4 (правда последнем 4.4.7).

Цитата(Mal Hack @  13.8.2007,  22:29 Найти цитируемый пост)
Если поставить себя на место разработчиков, то мне кажется более лучший вариант, когда  fseek (в случае потоков) искал бы место нужной инфы на диске и давал ее не считывая то, что впереди... Это быстрее.

Прошу прощенья, тут я забыл добавить, что это только мое предположение, как ведет себя fseek() в PHP. Я не утверждаю, что это так на самом деле, но, имхо, это единственный способ установить курсор в нужную позицию в режиме ASCII.

Это сообщение отредактировал(а) sTa1kEr - 14.8.2007, 00:55
PM MAIL   Вверх
Severyanin
Дата 14.8.2007, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



Mal Hack:
Цитата

Тот факт, что фопен помещает файл целиком в память - 100%.

А какое тогда отличие от file?


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 14.8.2007, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Severyanin @  14.8.2007,  05:49 Найти цитируемый пост)
А какое тогда отличие от file? 

file - обертка фопен, которая расширяет его возможности и читает файл в массив.

Цитата(sTa1kEr @  13.8.2007,  23:40 Найти цитируемый пост)
Через fopen, процесс PHP прочел с диска > 80мб данных, а вот памяти сам PHP не съел ни одного лишнего байта, но система съедала где-то еще 4мб, т.е. такое впечатление, что она просто не успевала освобождать память. Если, к примеру, в цикл вставить usleep(100), то же лишняя память не расходовалась. Проверял и на PHP 4 (правда последнем 4.4.7).

У тебя ПХП как модуль апача или как фаст-цгай настроен? Вопрос принципиальный.
Можешь более конкретнее привести цифры с теми параметрами к которым они относятся, чисто ради интереса... Смущают 80 метров как-то...
PM ICQ   Вверх
Diesel Draft
Дата 14.8.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



sTa1kEr, Откуда знание о реализации?

Цитата(Mal Hack)

Хм... Что-то я такого не помню, подкинь ссылку, посмотрю.

Вот не помню, увижу напишу.


Цитата(sTa1kEr)

Прошу прощенья, тут я забыл добавить, что это только мое предположение, как ведет себя fseek() в PHP. Я не утверждаю, что это так на самом деле, но, имхо, это единственный способ установить курсор в нужную позицию в режиме ASCII.

З чего ты взял? Я не не вижу смысла читать весь файл все по дороге за курсором.


Вот тест меня удивил


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
sTa1kEr
Дата 14.8.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Цитата(Mal Hack @  14.8.2007,  06:59 Найти цитируемый пост)
У тебя ПХП как модуль апача или как фаст-цгай настроен?

Я тестировал через CLI и через модуль apache - одинаково.

Цитата(Mal Hack @  14.8.2007,  06:59 Найти цитируемый пост)
Можешь более конкретнее привести цифры с теми параметрами к которым они относятся, чисто ради интереса... Смущают 80 метров как-то... 

Могу привести точные цифры использования памяти, добавил в конце скрипта var_dump(win32_ps_stat_proc());
Код

array(4) {
  ["pid"]=>
  int(7144)
  ["exe"]=>
  string(36) "C:\PHP\php.exe"
  ["mem"]=>
  array(9) {
    ["page_fault_count"]=>
    int(2623)
    ["peak_working_set_size"]=> 
    int(10211328) //  Пиковое использование памяти
    ["working_set_size"]=>
    int(10211328) // Текущее использование памяти
    ["quota_peak_paged_pool_usage"]=>
    int(145136)
    ["quota_paged_pool_usage"]=>
    int(145136)
    ["quota_peak_non_paged_pool_usage"]=>
    int(8000)
    ["quota_non_paged_pool_usage"]=>
    int(7936)
    ["pagefile_usage"]=>
    int(7245824) // использование swap
    ["peak_pagefile_usage"]=>
    int(7245824) // пиковое использование swap
  }
  ["tms"]=>
  array(3) {
    ["created"]=>
    float(64.954)
    ["kernel"]=>
    float(0.828)
    ["user"]=>
    float(0.39)
  }
}

Как узнать в Windows через PHP количество обращений к винту и количество прочитанных данных я не знаю, только разве что через Win32API, но это разве, что когда будет свободное время реализовать. А судя по Task Manager-у 82 003 210 байт прочитано.

Цитата(Diesel Draft @  14.8.2007,  10:27 Найти цитируемый пост)
sTa1kEr, Откуда знание о реализации?

Я же сказал, что это мое предположение. Хотя ни что не мешает покопаться исходниках и посмотреть как там реализован fseek()

Цитата(Diesel Draft @  14.8.2007,  10:27 Найти цитируемый пост)
З чего ты взял? Я не не вижу смысла читать весь файл все по дороге за курсором.

Если, к примеру, прочитать до оффсета 500 байт в текстовом режиме, то длина прочитаного может быть меньше, к примеру, 450 байт, что может стать причиной ошибок.

Это сообщение отредактировал(а) sTa1kEr - 14.8.2007, 18:34
PM MAIL   Вверх
Mal Hack
Дата 14.8.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



82 метра - слишом странно...
Может он в процессе работы скрипта скидывал и читал из виртуалки системной...
Как-ть обязательно протестирую на досуге.
PM ICQ   Вверх
sTa1kEr
Дата 14.8.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Как выяснилось ~80мб при любом размере файла, т.е. по 8кб на каждый fseek(). Тут определенно надо разобраться.
В Linux-е тот же скрипт так же не увеличивает использование памяти, но как просмотреть обращения к диску я не знаю.
PM MAIL   Вверх
Diesel Draft
Дата 15.8.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Парне а вы точно то считаете?


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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