泡菜在做什么?

时间:2018-11-28 23:46:57

标签: python python-3.x pickle

我已经使用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年中,我从未遇到过这个问题...因此,我飞跃地认为这很奇怪,我们可能应该只使用数据库。

1 个答案:

答案 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)