Обработка большого файла и 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.

Что происходит? Почему обрыв?
Как пройтись по всему файлу?
 

AmdY

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

antd2000

Новичок
Нет, время выполнения скрипта хватает.

xmlreader ... это тот же SAX или что то иное?
 

dimagolov

Новичок
Есть xml файл на 120Mb и 130 миллионов строк.
antd2000, марш в школу учить математику. так как в то, что твои строки занимают отрицательное число байт в файле, я не верю.
 

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 строк

Как такое может быть ?
 

dimagolov

Новичок
слушай, ты заврался
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КБ
 

antd2000

Новичок
dimagolov

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

dimagolov

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

-~{}~ 14.08.09 11:47:

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

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