У меня есть фрагмент кода, который генерирует довольно большие списки на каждой итерации. Чтобы сохранить память, я хочу записать каждый список в двоичный файл на каждой итерации после создания списка. Я пробовал это с текстовыми файлами (даже установив параметр в "wb" в linux). "wb", похоже, не имеет никакого эффекта для записи файла в двоичном или текстовом формате. Более того, письменный файл огромен, и я не хочу этого. Я уверен, что если я смогу записать эти списки в двоичном формате, этот файл будет намного меньше. спасибо
Поскольку вы упомянули о необходимости сжимаемости, я бы предложил использовать pickle
с помощью gzip
для сжатия вашего вывода. Вы можете писать и читать свои списки по одному, вот пример того, как:
import gzip, pickle
output = gzip.open('pickled.gz', 'wb', compresslevel=9)
for x in range(10):
output.write(pickle.dumps(range(10)) + '\n\n')
output.close()
И затем используйте генератор для отображения списков по одному за раз:
def unpickler(input):
partial = []
for line in input:
partial.append(line)
if line == '\n':
obj = ''.join(partial)
partial = []
yield pickle.loads(obj)
input = gzip.open('pickled.gz', 'rb')
for l in unpickler(input):
print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Единственное, что изменил флаг 'b'
, - это то, как выполняются переводы строк для поддержки Windows.
import pickle
help(pickle.load)
help(pickle.dump)
# seems fairly efficient, taking 200bytes to store [1,2,...,100],
# 2.7kb to store [1,2,...,1000],
# and 29kb to store [1,2,...,10000]:
>>> len(pickle.dumps(list(range(100))))
208
>>> len(pickle.dumps(list(range(1000))))
2752
>>> len(pickle.dumps(list(range(10000))))
29770
#create and store
data = {}
data['myList'] = [i for i in range(100)]
with open('myfile.pickle', 'wb') as f:
pickle.dump(data, f)
# retrieve
with open('myfile.pickle', 'wb') as f:
data2 = pickle.load(f)
print(data2)
Обратите внимание, что использовать pickle
для любых пользовательских данных небезопасно. Вам нужно будет открыть файл, который вы пишете, в двоичном режиме.
Вы можете использовать cPickle для сериализации ваших списков и выгрузки результата в файл.