Обработка больших (более 1 ГБ) файлов в PHP с использованием stream_filter_ * - PullRequest
3 голосов
/ 28 октября 2008
$fp_src=fopen('file','r');

$filter = stream_filter_prepend($fp_src, 'convert.iconv.ISO-8859-1/UTF-8');

while(fread($fp_src,4096)){
    ++$count;
    if($count%1000==0) print ftell($fp_src)."\n";
} 

Когда я запускаю этот скрипт, он потребляет ~ 200 МБ ОЗУ после прохождения всего 35 МБ файла.

Запуск без использования stream_filter с постоянным объемом памяти ~ 10 МБ.

Что дает?

Ответы [ 3 ]

1 голос
/ 28 октября 2008

Вам нужно только зарегистрировать пользовательские фильтры. iconv встроен. Это не особая операция, использование потокового фильтра для rot13 демонстрирует аналогичное поведение.

0 голосов
/ 28 октября 2008

По какой конкретной причине вы хотите использовать stream_filter_prepend ()? Если это вызывает проблемы с памятью, я бы нашел другой способ сделать то, что он делает.

0 голосов
/ 28 октября 2008

Из того, что я читаю здесь , вы неправильно реализуете stream_filter_prepend(), хотя может быть что-то не так в этом процессе.

Als, я не совсем уверен, но я готов поспорить, что это больше связано с тем, что iconv - это дорогой процесс, и меньше связано с тем, что вы используете его в качестве потока фильтр.

Удачи.

...