Обработка большого файла и fgets

antd2000

Новичок
Обработка большого файла и fgets

Есть xml файл на 120Mb и 130 миллионов строк.
Пытаюсь просто пройтись по нему в цикле.
PHP:
$xmlfile=fopen("test.xml","r");  
$line_num=1;  
while ($line = fgets($xmlfile,1024)) {
 $line_num++;  
} 
print $line_num;
Так вот в конце работы скрипта $line_num оказывается всего лишь 1802263 !
До 130 миллионов далековато.
Если сделать fgets($xmlfile,8), то получается уже 19406572.

Что происходит? Почему обрыв?
Как пройтись по всему файлу?
 
смотри ошибки, наверняка время выполнения скрипта.
а почему не пользуетесь xmlreader?
 
Нет, время выполнения скрипта хватает.

xmlreader ... это тот же SAX или что то иное?
 
Есть xml файл на 120Mb и 130 миллионов строк.
antd2000, марш в школу учить математику. так как в то, что твои строки занимают отрицательное число байт в файле, я не верю.
 
dimagolov
:) Не 130 миллионов конечно. Это я не туда посмотрел в редакторе (это число символов).

Но все равно остается непонятно.
Юниксовый wc -l test.xml выдает 1797511 строк.
Виндовый блокнот выдает 1801084 строк.
Мой же скрипт выдает разные числа в зависимости от того какой параметр максимальной длины строки передать в fgets.

fgets($xmlfile,20000) - 1797513 строк
fgets($xmlfile,10000) - 1797513 строк
fgets($xmlfile,8000) - 1797513 строк
fgets($xmlfile,1024) - 1802263 строк
fgets($xmlfile,8) - 19406572 строк
fgets($xmlfile,2) - 18 строк

Как такое может быть ?
 
слушай, ты заврался
fgets($xmlfile,8000) - 31892 строк
fgets($xmlfile,1024) - 1802263 строк
fgets($xmlfile,8000) - 1797513 строк
Note: Until PHP 4.3.0, omitting it would assume 1024 as the line length. If the majority of the lines in the file are all larger than 8KB, it is more resource efficient for your script to specify the maximum line length.
То есть указывать 2-й параметр имеет смысл ТОЛЬКО если строки больше 8КБ
 
dimagolov

То есть если указать параметр, когда строки менее 8 Kb, то fgest выдает неправильные значения так что ли ?
 
antd2000, ты вообще читал что значит этот параметр? потому что судя по тому что ты в него тулишь, ты и близко не представляешь его назначение.

-~{}~ 14.08.09 11:47:

Кстати, 2 лишние строки у тебя от того, что:
1. у тебя всегда подсчет начинается с одной строки, а надо с 0
2. пустые строки это строки, а у тебя они выбрасывают из цикла

Короче, RTFM
 
Сверху