Есть ли лучший способ временно сохранить много выходных данных для текстового файла (для размещения в столбцах и строках), помимо использования нескольких временных файлов?

#python #database #file #text #storage

#python #База данных #файл #текст #Хранение

Вопрос:

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

Моя проблема заключается в методе — он кажется слишком запутанным и включает в себя множество временных файлов (у меня пять), которые, как я убедился, содержат точное количество строк, соответствующее каждой точке данных, и которые будут объединены в один файл только после завершения всех вычислений. Мой код настолько запутан, что мне даже приходится один раз использовать deque, чтобы вырезать несколько лишних строк из временного файла.

Я использую этот шаблон несколько раз в своих скриптах

 o = open('%s_outcombined.xvg'%outfile, 'a ')
fh = open('%s_outfinal.xvg'%outfile, 'rb')
fh2 = open('%s_outfor_diff_calcs.xvg'%outfile, 'rb')
for line in fh.readlines():
   o.write(line.strip('rn')   fh2.readline().strip('rn')   'n')
fh.close()
fh2.close()
o.close()
  

для создания и объединения указанных временных файлов.

Ожидаемые результаты:

  • Один текстовый файл, который имеет числовые значения, разделенные запятыми — это будет получено из вычислений, сделанных для входного файла объемом 12 ГБ.

  • Метод, который не предполагает использования нескольких временных файлов (или, если есть способ сделать их скрытыми, я действительно хотел бы знать)

  • Метод хранения данных, который не требует много времени

Фактические результаты:

  • Несколько временных файлов, беспорядочный код

Мне интересно, является ли использование списков для хранения огромного объема данных (входной файл для вычисления составляет 12 ГБ) более трудоемким, или мне следует придерживаться моего текущего метода, или если у вас есть идеи получше, я был бы очень признателен.

Ответ №1:

Вы могли бы выполнить эту работу с помощью пакетов, поскольку 12 ГБ в большинстве случаев слишком велики для хранения в памяти. Что-то вроде обработки первых 200 строк с сохранением их в памяти и сохранения их в свой выходной файл, затем переходите к следующим 200 строкам, пока не дойдете до конца.

Псевдокод:

 outputFile = new File("output")
inputFile = new File("input")

row = inputFile.readLine() # first line

while row != null:
   if outputFile.readLine() == null: # so we don't recalculate already calculated data
      columns = row.split(",")
      columns = doFirstCalculation(columns)
      columns = doSecondCalculation(columns)
      outputFile.appendLine(columns.join(","))
   else:
      print("skipped line since already calculated")
   row = inputFile.readLine() # next line

  

Просто выполняйте меньше операций чтения и записи, что увеличивает скорость. Оперативная память быстрее, чем диск.

Комментарии:

1. Я обрабатываю входной файл объемом 12 ГБ на кадр (~ 8730 строк на кадр), что стало возможным благодаря циклу for. Указанные 8730 строк хранятся во временном файле, который затем обрабатывается моим кодом. Когда этот кадр заканчивается, весь временный файл перезаписывается следующими 8730 строками (следующий кадр), так что да, я уже делаю то, о чем вы думаете. Моя проблема заключается в создании выходных файлов. Кажется, мне нужно слишком много временных файлов, чтобы убедиться, что выходные данные каждого фрейма хранятся безопасно.

2. Не могли бы вы просто выполнить оба шага без временного сохранения или записи во входном файле имеют какое-либо отношение друг к другу?