[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Чтение файла
I++

// test.bin - размер файла 30 mb

$fp = fopen('test.bin', "rb");
$buf .= fread($fp, 32768); // Чтение

$current_buffer = ... // Сюда должен попасть кусок (chunk) размером 1024 байта.
$buf = ... // Должен уменьшится на 1024 байта, начиная с начала.



Смысл в том, что читать файл блоками по 1024 не эффективно. Поэтому требуется ввести промежуточный буфер, из которого будет браться кусок по 1024 байта.

Есть идеи? При этом код нужно сделать максимально эффективным. Громоздкие конструкции, будут надолго вешать обработку в случае когда размер файлов по 30+ гигов.


Кажется сам ответил на свой вопрос, но!

$fp = fopen('test.bin', 'rb');

while(!feof($fp))
{
$buffer = fread($fp, 32768);

while(strlen($buffer) != 0)
{
$chunk = substr($buffer, 0, 1024);
$buffer = substr($buffer, 1024);
echo 'Buffer: '.strlen($buffer).' Chunk: '.strlen($chunk)."\n";
}
}


Buffer: 31744 Chunk: 1024 Возможно strlen врет, попробую mb_strlen

В общем не подходит substr, очень долго обрабатывает.



Спустя 4 часа, 16 минут, 16 секунд (31.03.2012 - 00:32) killer8080 написал(а):
А если так?
for($i = 0; $i < 32768; $i += 1024){
$chunk = substr($buffer, $i, 1024);
...

}

Спустя 26 минут, 40 секунд (31.03.2012 - 00:59) I++ написал(а):
Нашел другое решение, вот:

$fp = fopen($filename, "rb");

if(!$fp)
return false;

while(!feof($fp))
{
$buffer = fread($fp, 32768);
$buffer = str_split($buffer, 1024);

foreach($buffer as $chunk)
{
// ...
}
}


Это оказалось намного быстрее :)

Проверил твой код.

2259.276 ms - твой
1808.999 ms - мой

Там еще ошибка есть в цикле for, с лишними итерациями. Но это ладно лечится.

Спустя 16 минут, 28 секунд (31.03.2012 - 01:15) ADiel написал(а):
$fh = fopen("file");
while ($content = fread($fh,1024)){
// работаем с блоком
}

ну если нужно прочиать файл целиком, то file_get_contents("file");

Спустя 20 минут, 18 секунд (31.03.2012 - 01:35) I++ написал(а):
Ага, файл гигов на 30. По 1024 не выгодно читать, долго читать будет. По 32кб в самый раз, больше смысла нет, скорость падает задержки увеличиваются.

Да все кажется решил, уже больше некуда оптимизировать, хотя есть мечты, что каким то образом можно читать строку с определенной позиции по позицию X, но это все сказки.
Быстрый ответ:

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