Максимальный объект Python, который может быть передан в write()

#python #file #size

#python #файл #размер

Вопрос:

Я просматриваю сеть (пока я нашел pickle) для объяснения того, что я делаю неправильно

Я пытаюсь записать очень большую структуру данных (вложенный словарь / список) в file. Используя приведенный ниже код, я обнаружил, что проблема может быть в том, что переданная строка слишком велика:

 f = open('/path/to/file' , 'w')

try:
 f.write(str(dataStructure))
except:
 try:
  f.write('ABC')
 except:
  print 'Even smaller strings such as ABC did NOT print to the file'
 else:
  print 'Smaller strings such as ABC DID print to the file'
  

dataStructure словарь содержит большое количество информации о кликах, в данном случае около 10 000-100 000 значений с плавающей запятой. Вся причина, по которой я сбрасываю все в один файл, вместо сохранения в вложенных файлах, заключается в том, что я хочу выполнить один файл для его загрузки, а не вручную загружать несколько десятков подмножеств файла.

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

Спасибо

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

1. Да, пожалуйста, опубликуйте конкретное исключение, которое вы получаете, чтобы мы могли предоставить вам более точную помощь!

2. Если вы не разместили try / except вокруг своего большого блока «создать огромную строку и записать», и блок не сработал, вы должны получить исключение, сообщающее вам, почему оно не сработало.

3. Странно, мой комментарий не был опубликован. В принципе, я забыл напечатать исключение. Мне требуется огромное количество усилий, чтобы изменить программу. Это MPI, работающий в общем кластере. В лучшем случае я бы запустил и вывел программу в течение 24 часов. Я попробую предложение pickle ниже, если это не сработает, я выведу исключение. Каков наилучший способ вывода исключения raise Exception ?

4. Лучший метод — не перехватывать исключения. Конечно, вы никогда не должны делать то, что делаете, перехватывая все возможные исключения вместо конкретных исключений, которые вы получаете.

5. Исключения очень раздражают, AFAIK, в MPI. Они никогда не отображают всю трассировку. Поэтому я привык помещать инструкции try везде, где будут возникать ошибки, и я вывел свое собственное, более полезное сообщение.

Ответ №1:

Я предполагаю, что ваша проблема в том, что создаваемая вами строка слишком велика, чтобы существовать в памяти. Для чего-то такого большого вы должны записывать его по частям на диск.

Вы можете использовать pickle, json, xml или что-то, что должно правильно обрабатывать это.

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

1. спасибо, я собираюсь переключиться на pickle. надеюсь, это сработает. Мне никогда не приходило в голову, что он будет слишком большим, чтобы существовать в памяти. Я просто предположил, что ОС будет отображать его или что-то в этом роде.

2. @puk, я считаю, что это ограничения на размер одного выделенного блока в памяти.

3. Похоже, что Pickle работает, однако сохраненный файл кажется зашифрованным (есть тысячи строк с идентичной строкой ‘aF0.0097087378640778529’. Я подозреваю, что именно поэтому файл такой большой (6,7 ГБ). Теперь я должен загрузить его, чтобы проверить, правильно ли он сохранен

4. @puk, это не читаемый формат. Если вы этого хотите, вы захотите использовать json или что-то в этом роде. Вы также можете посмотреть документацию pickle, чтобы увидеть различные доступные форматы. Некоторые другие более эффективны.