Низкое использование памяти, выскакивание случайной строки из файлаPython

Программы на Python
Anonymous
Низкое использование памяти, выскакивание случайной строки из файла

Сообщение Anonymous »

  • У меня есть файл неизвестной длины от 1 до ~34 миллиардов (2^35)
  • Я хочу запустить некоторый процесс $P$, который занимает при вводе каждой строки файла.
  • Я хочу, чтобы P запускался на случайных входных данных, то есть случайных строках файла.
  • Я хочу, чтобы P никогда не запускался. дважды в одной и той же строке
Я нашел два разных решения этой проблемы
Решение 1 :
откройте файл, выберите случайную строку, вытащите ее из файла, запустите P.
Проблема 1: я знаю, как это сделать с первой строкой файла, использующей этот код, который я получил ранее сегодня, но не с случайной строкой из файла, который я даже не могу открыть полностью, чтобы проверить, насколько он длинный.

Код: Выделить всё

def pop(self, file):
### pop the first line from given file (aka removes it from the input file)
with open(file, 'r+') as f: # open file in read / write mode
firstLine = f.readline() # read the first line and throw it out
data = f.read() # read the rest
f.seek(0) # set the cursor to the top of the file
f.write(data) # write the data back
f.truncate() # set the file size to the current size
return firstLine

def fifo(input):
return pop(input, input)
Решение 2:
Выполните предыдущий код, предварительно случайно перетасовав строки файла один раз.
Для контекста строки соответствуют всем двоичным числам по 35 бит. Это код, который я использовал:

Код: Выделить всё

def allBits(n):
if n: yield from ( bits+bit for bits in allBits(n-1) for bit in ("0","1") )
else: yield ""

def layer2():
L = allBits(35)
numpy.random.shuffle(L)
f = open(filename, mode = 'w')
for e in L:
f.write(e+';\n')
что приводит к следующей ошибке:

Код: Выделить всё

File "XXX.py", line 20, in layer2
numpy.random.shuffle(L)

File "mtrand.pyx", line 4467, in numpy.random.mtrand.RandomState.shuffle
TypeError: object of type 'generator' has no len()
Из того, что я увидел в этом вопросе (как перетасовать очень большой список в Python?), это потому, что список слишком велик. Есть много предлагаемых решений, которые на самом деле не соответствуют тому, что мне нужно. Если быть более конкретным, я хочу использовать файл, чтобы я мог запускать P на всех входах в нескольких исполнениях: реально мне понадобится несколько дней, чтобы сделать все, и я абсолютно не хочу 1. держать свой компьютер включенным все время 2 . Будьте уверены в том, что во время казни электричество не отключится

Подробнее здесь: https://stackoverflow.com/questions/790 ... -from-file

Вернуться в «Python»