[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Посимвольное чтение файла
bat_dmitry
Здравствуйте!

Пишу функцию посимвольного чтения utf8 файла. Файл размером 224 Кб.

код

$f = fopen("myfile","rb");
while(!feof($f))
{
fread($f,1);
}
fclose($f);

читает этот файл за ~1.69 секунд.

Я добавил функцию чтения с поддержкой буфера

function fread_buf()
{
global $sBuffer,$iBufferPointer,$f;
if($iBufferPointer == (strlen($sBuffer)))
{
if(feof($f))
{
return -1;
}
$sBuffer = fread($f, BUFF_SIZE);
$iBufferPointer = 0;
}
return $sBuffer{$iBufferPointer++};
}

но какой бы я размер буфера BUFF_SIZE не ставил, время перебора файла лишь немного увеличилось и стало в районе ~2.4 секунд.

Такое чувство, будто PHP всё равно использует некую оптимизацию при посимвольном чтении (что С, что БЕЗ буфера). Возможно, PHP всё равно грузит весь файл в оперативку для перебора. Как это отключить? Возможно ли это отключить?
Игорь_Vasinsky
может быстрее будет прочитать его в память (так же кусками - но большими) - после этого работать с переменной построчно?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
bat_dmitry
Я как раз и писал поддержку буфера, чтобы было быстрее. Мне не понятно почему этого не произошло. На самом деле, это даже несколько ухудшило ситуацию. Можно поставить буфер сколь угодно большого размера, но скорости это не добавит. А работать с файлом мне нужно именно посимвольно, к тому же приходится склеивать вручную utf8 коды символов.
linker
$data = file_get_contents('file.txt');
и не парься.

_____________
Gear Framework
Gear Framework на Github
Игорь_Vasinsky
большой файл с таким примером - может создать проблемы.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
sergeiss
Цитата (bat_dmitry @ 16.02.2014 - 10:15)
Я как раз и писал поддержку буфера, чтобы было быстрее.

Насколько мне не изменяет мой склероз, файлы читаются не посимвольно, а именно в буфер. Который определяется операционной системой и самим диском. Так что твой буфер никак не поможет ускорить процесс.

Лучше просто загружай файл целиком, как выше уже посоветовали.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.