我已经使用Python多年了。我已经广泛使用泡菜。我不知道这是怎么回事:
with codecs.open("huge_picklefile.pc", "rb") as f:
data = pickle.load(f)
print(len(data))
data = pickle.load(f)
print(len(data))
data = pickle.load(f)
print(len(data))
这又回到我这里:
335
59
12
我很困惑。我习惯腌制将大量文件加载到内存中。对象本身是一个庞大的数组数组(我假设)。它可以由多个泡菜对象组成吗?不幸的是,我没有创建泡菜对象,也没有访问权限。
我不知道为什么pickle会将我的文件分成几块,这不是默认值,我也没有告诉它。重新加载同一文件有什么作用?老实说,直到现在,我从未尝试过,甚至从未遇到过用例。
我花了5个小时来弄清楚如何在Google上问这个问题。毫不奇怪,尝试“在同一文档上加载多个泡菜”不会产生任何用处。 Python 3.7 pickle文档未描述此行为。我无法弄清楚如何反复加载泡菜文档不会(a)崩溃或(b)将整个内容加载到内存中,然后仅引用自身。在使用python的15年中,我从未遇到过这个问题...因此,我飞跃地认为这很奇怪,我们可能应该只使用数据库。
答案 0 :(得分:5)
此文件不是泡菜文件。有人将多个泡菜转储到同一文件中,导致文件内容是多个泡菜的串联。调用pickle.load(f)
时,pickle
将从当前文件位置读取文件,直到找到一个泡菜末,因此每次pickle.load
调用都会加载下一个泡菜。
您可以通过反复调用pickle.dump
来自己创建这样的文件:
with open('demofile', 'wb') as f:
pickle.dump([1, 2, 3], f)
pickle.dump([10, 20], f)
pickle.dump([0, 0, 0], f)