Я не могу придумать, как случайным образом сделать весь файл без какого-либо ведения списка того, что уже было написано.Я думаю, что если бы мне пришлось сделать тасование с эффективным использованием памяти, я бы просканировал файл, составив список смещений для новых строк.Получив этот список новых смещений строк, я бы случайно выбрал одно из них, записал его в стандартный вывод и затем удалил его из списка смещений.
Я не знаком с perl или python, номожно продемонстрировать с помощью php.
<?php
$offsets = array();
$f = fopen("file.txt", "r");
$offsets[] = ftell($f);
while (! feof($f))
{
if (fgetc($f) == "\n") $offsets[] = ftell($f);
}
shuffle($offsets);
foreach ($offsets as $offset)
{
fseek($f, $offset);
echo fgets($f);
}
fclose($f);
?>
Единственный другой вариант, который я могу придумать, если сканирование файла на наличие новых строк абсолютно неприемлемо, будет (я не собираюсь его кодировать):
- Определение размера файла
- Создание списка смещений и длин, уже записанных в стандартный вывод
- Цикл до bytes_written == размер файла
- Поиск случайного смещениякоторого нет в вашем списке уже записанных значений
- Резервное копирование с этого поиска на предыдущую новую строку или начало файла
- Показать эту строку и добавить ее в список смещений и длиннаписано
- Перейти к 3.