Вывод Python Split itertools в несколько файлов (БОЛЬШОЙ вывод) - PullRequest
0 голосов
/ 02 ноября 2019

Итак, я создал скрипт для чтения строк из файла (1500 строк)

Запишите их как 10 на строку (и сделайте все возможные выходные данные, которые мы можем получить с помощью продукта abcda, abcdb и т. Д.)

Дело в том, что в тот момент, когда я запускаю скрипт, мой компьютер полностью зависает (потому что он записывает столько данных)

Поэтому я подумал, что если будет возможно запускать скрипт каждые 100 мб, он сохранит егов файл и сохраните текущее состояние, чтобы при повторном запуске сценария он фактически запускался с того места, где мы остановились (последняя строка в файле 100 МБ)

Или, если у вас есть другое решение, я бы хотел услышать его: P

вот сценарий:

from itertools import product

with open('file.txt', 'r') as f:
    content = f.readlines()
comb = product(content, repeat=10)
new_content = [elem for elem in list(comb)]
with open('log.txt', 'w') as f:
    for line in new_content:
        f.write(str(line) + '\n')

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Я бы открыл файл в отдельной функции и вывел бы строку за раз - таким образом, вы никогда не собираетесь разрушать вашу память.

function read_file(filename):
    with open(filename", "r") as f:
        for line in f:
            yield line

Тогда вы можете использовать это в своем коде:

for line in read_file("log.txt"):
    f.write(line + "\n")
0 голосов
/ 02 ноября 2019

Строка

new_content = [elem for elem in list(comb)]

берет генератор и дважды преобразует его в список в памяти. Результат такой же, как при выполнении

new_content = list(comb)

Ваш компьютер зависает, поскольку он будет использовать всю доступную оперативную память. Поскольку вы используете new_content только для перебора, вы можете просто перебрать исходный генератор напрямую:

from itertools import product

with open('file.txt', 'r') as f:
    content = f.readlines()
comb = product(content, repeat=10)
with open('log.txt', 'w') as f:
    for line in comb:
        f.write(str(line) + '\n')

Но теперь это заполнит ваш жесткий диск, так как при входном размере 1500 строк он будет производить57665039062500000000000000000000 строк (1500 ** 10) вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...