Я написал скрипт, который извлекает данные биткойнов и сохраняет их в файлах .txt или, если они существуют, обновляет их. Файлы .txt - это узлы и отношения, соединяющие узлы для neo4j.

В начале сценария:

  1. Он проверяет, существуют ли файлы, поэтому открывает их и добавляет новые строки ИЛИ
  2. Если файлы не существуют, скрипт создает их и начинает добавлять строки.

Файлы .txt постоянно открыты, скрипт записывает новые данные. Файлы .txt закрываются, когда все данные записываются или я прекращаю выполнение.

Мой вопрос:

Должен ли я открывать, писать, закрывать каждый файл .txt для каждой итерации и для каждого файла .txt?

Или

Должен ли я сохранить это так, как сейчас; откройте файлы .txt, сделайте всю запись, когда запись будет завершена, закройте файл .txt

Я сохраняю данные из 6013 блоков. Каким образом можно минимизировать риск повреждения данных, записанных в файлах .txt?

-3
Andreas Manousakis 26 Июн 2019 в 17:31

3 ответа

Лучший ответ

Хранение файлов будет быстрее. В комментариях вы упомянули, что «Потеря ранее записанных данных не вариант». Вероятность повреждения файлов выше для открытых файлов, поэтому открывать и закрывать файл на каждой итерации более надежно. Существует также возможность сохранять данные в некотором буфере и записывать / добавлять буфер в файл, когда все данные получены или по прерыванию пользователя / системы или по таймауту сети.

0
Yuri Ginsburg 3 Июл 2019 в 06:25

Я думаю, что сохранение файла будет более эффективным, потому что python не нужно будет искать файл и открывать его каждый раз, когда вы хотите прочитать / записать файл.

Я думаю, это должно выглядеть так

with open(filename, "a") as file:
    while True:
        data = # get data
        file.write(data)
0
בנימין כהן 26 Июн 2019 в 15:47

Запустите бенчмарк и убедитесь сами в типичном ответе на этот вопрос.

Тем не менее открытие и закрытие файла имеет свою стоимость. Python должен выделить память для буфера и структур данных, связанных с файлом, и вызвать некоторые функции операционной системы, например, open системный вызов, который, в свою очередь, будет выполнять поиск файл в кеше или на диске.

С другой стороны, существует ограничение на количество файлов, которые программа, пользователь, вся система и т. Д. Могут открыть одновременно. Например, в Linux значение в /proc/sys/fs/file-max обозначает максимальное количество дескрипторов файлов, которое будет выделено ядром. Когда вы получаете множество сообщений об ошибках, связанных с исчерпанием файловых дескрипторов, вы можете увеличить это ограничение (source). Если ваша программа работает в такой ограничивающей среде, было бы хорошо, чтобы файл оставался открытым только при необходимости.

0
Cristian Ciupitu 26 Июн 2019 в 16:48