Лучший способ записать строки массива в файл внутри, а не после цикла? - PullRequest
1 голос
/ 27 марта 2019

Я новичок здесь и на python в целом, поэтому, пожалуйста, прости меня за любые вопросы форматирования и все остальное.Я физик, и у меня есть параметрическая модель, где я хочу перебрать одно или несколько значений параметров модели (возможно, в настройке MCMC).Но для простоты представьте, что у меня есть только один параметр с N возможными значениями.В цикле я вычисляю модель и несколько скалярных метрик, относящихся к ней.

Я хочу сохранить данные [значение параметра, metric1, metric2, ...] построчно в файл.Мне все равно, какой тип: .pickle, .npz, .txt, .csv или что-нибудь еще в порядке.

Я НЕ хочу сохранить массив после того, как все N модели были вычислены.Проблема здесь заключается в том, что иногда значение параметра настолько нефизично, что программа, которую я вызываю для расчета модели (что является сложным делом много лет, поэтому я не касаюсь его), приводит к поломке ядра.Если у меня есть N = 30000 моделей, и это происходит в 29000 , я буду очень несчастен и потрачу впустую много времени.Я также, вероятно, должен осознавать использование памяти - я выяснил, как сделать то, что я предлагаю, с текстовым файлом, но он падает примерно на 2600 строк, потому что я не думаю, что ему нравится открывать текстфайл, который долго.

Итак, некоторый псевдокод:

filename = 'outFile.extension'
dataArray = np.zeros([N,3])
idx = 0
for p in Parameter1:
    modelOutputVector = calculateModel(p)
    metric1, metric2 = getMetrics(modelOutputVector)
    dataArray[idx,0] = p
    dataArray[idx,1] = metric1
    dataArray[idx,2] = metric2
    ### Line that saves data here
    idx+=1

Я неравнодушен к форматам npz или pickle, но не могу понять, как это сделать с помощью,Если есть лучший формат или лучшее решение, я буду признателен за любой совет.

Редактировать: то, что я пытался сделать текстовым файлом, было внутри цикла:

fileObject = open(filename, 'ab')
np.savetxt(fileObject, rowOfData, delimiter = ',', newline = ' ')
fileObject.write('\n')
fileObject.close()

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

1 Ответ

0 голосов
/ 27 марта 2019

Трудно сказать с таким ограниченным знанием ошибки, но если вы думаете, что это ошибка записи файла, возможно, вы могли бы попробовать что-то вроде:

with open(filename, 'ab') as fileObject:
    # code that computes numpy array
    np.savetxt(fileObject, rowOfData, delimiter = ',', newline = ' ')
    fileObject.write('\n')
# no need to .close() because the "with open()" will handle it

Тем не менее

  • Я не использовал np.savetxt()
  • Я не эксперт по вашему проекту
  • Я даже не знаю, действительно ли это ошибка записи файла, чтобы начать с

Я просто предпочитаю технику with open(), потому что именно так все вводные книги по питону, которые я читал, структурируют процессы чтения / записи файлов, поэтому я предполагаю, что в этом есть мудрость. Вы также можете подумать о том, чтобы делать то же, что комментировал Фабианегли, и сохранять его в отдельных файлах (вот что делает моя работа).

...