Если вы не хотите загрузить все в память и отсортировать ее там, у вас есть для хранения строк на диске при выполнении случайной сортировки. Это будет очень медленно.
Вот очень простая, глупая и медленная версия. Обратите внимание, что это может занять удивительное количество дискового пространства, и это будет очень медленно. Я запустил его с 300 000 строк, и это занимает несколько минут. 3 миллиона строк вполне могут занять час. Итак: делай это в памяти. В самом деле. Он не такой большой.
import os
import tempfile
import shutil
import random
tempdir = tempfile.mkdtemp()
print tempdir
files = []
# Split the lines:
with open('/tmp/sorted.txt', 'rt') as infile:
counter = 0
for line in infile:
outfilename = os.path.join(tempdir, '%09i.txt' % counter)
with open(outfilename, 'wt') as outfile:
outfile.write(line)
counter += 1
files.append(outfilename)
with open('/tmp/random.txt', 'wt') as outfile:
while files:
index = random.randint(0, len(files) - 1)
filename = files.pop(index)
outfile.write(open(filename, 'rt').read())
shutil.rmtree(tempdir)
Другой версией будет сохранение файлов в базе данных SQLite и случайное выделение строк из этой базы данных. Это, вероятно, будет быстрее, чем это.