Я знаю, что название, вероятно, не лучший способ сформулировать мой вопрос, поэтому, пожалуйста, смело меняйте его, если сможете придумать что-нибудь получше!
У меня есть большой список строк (где-то между 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.
Итак, вот мои вопросы:
- Будет ли моему сценарию не хватать памяти или список слишком мал для этого (32 ГБ ОЗУ на компьютере, который я использую)?
- Если нехватка памяти не будет проблемой, я должен придерживаться первой реализации или я все еще выбираю вторую реализацию (записывать в файл каждую итерацию)?
- Если мне следует выбрать вторую реализацию, я должен поместить
with open
внутри цикла или снаружи? Что будет более эффективным и с меньшей вероятностью вызовет проблемы?
- Есть ли лучший способ сделать это? Вместо этого вы используете файлы CSV?