我需要以很多字典的形式将信息存储到一个非常大的文件中。这不是那么重要,只是说我试图首先将所有数据都输入这些词典中,但我的内存耗尽(~60Gb)。
很好,所以我想在文件中添加数据,而不是实际将其加载到内存中,通过在行上进行循环并在每行上附加一些文本。那可能吗?如果是这样,怎么样?
答案 0 :(得分:5)
你自己尝试过任何代码,你的发现是什么?您可以采用以下方法:
with open('/tmp/bigfile.new', 'w') as output:
with open('/tmp/bigfile', 'r') as input:
while True:
line = input.readline().strip()
if not line:
break
line += ' Look ma, no hands!'
print(line, file=output)
当然,除了“看不用手”之外你还有额外的字典; - )
答案 1 :(得分:1)
我建议使用泡菜使过程更容易。使用pickle不需要从行中解析dict。而且您可以做的不仅仅是添加数据,您可以更新它并将其删除。
import pickle
def update_dump_dict(dumps, key, value):
dict_reborn = pickle.loads(dumps)
dict_reborn[key] = value
dumps = pickle.dumps(dict_reborn)
return dumps
def update_line(line_number, key, value):
with open('datafile.db', 'wb') as output:
with open('new_datafile.db', 'rb') as input:
line_number -= 1
entry = input.readline()
if line_number == 0:
entry = update_dump_dict(entry, key, value)
print(entry, file=output)
>>> # Dump a dict
>>> some_dict = {1: "Hello"}
>>> dumped_dict = pickle.dumps(some_dict)
>>> print(dumped_dict)
b'\x80\x03}q\x00K\x01X\x05\x00\x00\x00Helloq\x01s.'
>>> # Load the dict.
>>> dict_reborn = pickle.loads(dumped_dict)
>>> print(dict_reborn[1])
Hello
为了在文件中保持人类可读性,您可以使用模块json:
import json
>>> # Dump a dict
>>> some_dict = {"key": "Hello"}
>>> dumped_dict = json.dumps(some_dict)
>>> print(dumped_dict)
{"key": "Hello"}
>>> # Load the dict.
>>> dict_reborn = json.loads(dumped_dict)
>>> print(dict_reborn["key"])
Hello
当然,以前的版本具有优势,您从文件中读取时不必担心类型。
尽管在已恢复的字典中(使用json.loads
),所有字符串(键和值)总是比解析该行以从中提取数据更加容易。