@brunot

Как перемешать строки в большом файле (до 1,5гб) средствами php?

В общем, скрипт откопал на форуме, мешает норм но при большом объеме файла, где-то срабатывает какой-то лимит, при том:

5118f538b40b444eb4b66ca56f1cd534.png (денвер на винде)

Вопрос скорее стоит таком образом: где еще нужно выключить ограничение, чтобы заработало?

Сам скрипт для микса такой:

<?php 

ini_set('memory_limit', '-1');
ini_set('max_execution_time', '-1');

$start = microtime(true);
define('NL',chr(13).chr(10));  
$file='file.txt'; 
$arr=explode(NL,file_get_contents($file));  
$f=fopen($file,'w'); 
shuffle($arr);  
fputs($f,implode(NL,$arr));  
fclose($f);  

$time = microtime(true) - $start;
printf('Скрипт выполнялся %.4F сек.', $time);

?>


Что пишет:

4b5f57fb8c3141d19b61c08bd616db1c.png

Также не против рассмотреть другие подходящие решения
  • Вопрос задан
  • 1060 просмотров
Решения вопроса 1
@Wol_fi
php, js, mysql, highload
Какие-то неправильные у вас пчёлы, $arr=explode(NL,file_get_contents($file)); - это плохо для любого языка, не только php, читать весь файл в память.
Вот тут есть пример для перемешивания файла, без его полной загрузки, с использованием позиций строк.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev
software engineer
Почему бы не воспользоваться SQL? Загоняете строки в SQL, а рандомизируете только индексы, или отдельный столбец с номером строки. Работать будет гораздо быстрее. Случайный доступ к нужной строке тоже быстрее. Памяти вообще не будет потреблять. Масштабируется.
Ответ написан
Комментировать
romy4
@romy4
Exception handler
ну или без SQL.
Набиваете массив строк (от 0 до к-во строк в файле). shuffle этого массива, потом считываете по одному значению из массива, читаете этот номер строки, записываете в новый файл.
Не забудьте сохранять позиции начала строк, относительно начала файла. 10 минут дела.
Ответ написан
Комментировать
Не мешайте весь файл целиком, разделите на адекватное количество частей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы