什么是咸菜?

Ben*_*and 6 python pickle python-3.x

我已经使用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))
Run Code Online (Sandbox Code Playgroud)

这回到我身边:

335
59
12
Run Code Online (Sandbox Code Playgroud)

我感到困惑.我习惯于将大量文件加载到内存中.对象本身是一个庞大的数组(我假设).它可以由多个泡菜对象组成吗?不幸的是,我没有创建pickle对象,我没有访问谁做了.

我无法弄清楚为什么pickle将我的文件拆分成块,这不是默认值,我不是告诉它的.重新加载同一个文件有什么作用?老实说,直到现在我从未尝试过甚至遇到过一个用例.

我花了5个小时试图找出如何在Google上提出这个问题.不出所料,尝试"在同一文件上加载多个泡菜"并不会产生任何有用的东西.Python 3.7 pickle文档没有描述这种行为.我无法弄清楚如何反复加载pickle文档不会(a)崩溃或(b)将整个内容加载到内存中然后只引用自己.在我使用python的15年中,我从来没有遇到过这个问题...所以我认为这很奇怪,我们应该只使用数据库.

use*_*ica 5

这个文件不是一个pickle文件.有人将多个泡菜转储到同一个文件中,导致文件内容成为多个泡菜的串联.当您调用时pickle.load(f),pickle将从当前文件位置读取文件,直到找到pickle结束,因此每次pickle.load调用都将加载下一个pickle.

您可以通过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)
Run Code Online (Sandbox Code Playgroud)