При итерациях по очень большому списку и записи в файл на каждой итерации, должен ли файл открываться в цикле или вне цикла? - PullRequest
0 голосов
/ 10 мая 2018

Я знаю, что название, вероятно, не лучший способ сформулировать мой вопрос, поэтому, пожалуйста, смело меняйте его, если сможете придумать что-нибудь получше!

У меня есть большой список строк (где-то между 50k-100k), которые я хотел бы перебрать, и в каждой итерации получить некоторую информацию о файле, а затем записать элемент с его информацией в файл.

У моей первоначальной реализации был второй список, и каждая итерация добавляла бы dict с элементом и его информацией. Затем, после того как список прошел итерацию, второй список (из dicts) будет записан в файл json. Тем не менее, я не учел тот факт, что все это будет храниться в памяти, и из-за размера списка была возможность, что ему не хватит памяти перед завершением, и мне придется перезапускать.

Оригинальная реализация:

results = []
for f in long_list:
    results.append({"item": f, "otherdata": some_function(f)})
    print(results[len(results)-1])

with open("results.json", "w") as fp:
    json.dump(results, fp)

Так что моя вторая реализация вместо этого записывает в файл (я в порядке, если это не JSON, я могу преобразовать его позже) каждую итерацию, поэтому нехватка памяти не будет проблемой (если это не произойдет, пожалуйста, исправьте меня если я не прав). Но с этой реализацией я не уверен, должен ли with open("file_name.txt", "a") as f входить в цикл for или вне цикла for.

Итак, вот мои вопросы:

  1. Будет ли моему сценарию не хватать памяти или список слишком мал для этого (32 ГБ ОЗУ на компьютере, который я использую)?
  2. Если нехватка памяти не будет проблемой, я должен придерживаться первой реализации или я все еще выбираю вторую реализацию (записывать в файл каждую итерацию)?
  3. Если мне следует выбрать вторую реализацию, я должен поместить with open внутри цикла или снаружи? Что будет более эффективным и с меньшей вероятностью вызовет проблемы?
  4. Есть ли лучший способ сделать это? Вместо этого вы используете файлы CSV?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...