pickle与python数据结构

pickle与python数据结构,python,pickle,Python,Pickle,我将一些数据存储在内存中的树中,并定期使用pickle将树存储到磁盘中。 最近我注意到程序使用了一个大内存,然后我检查了保存的pickle文件,它大约是600M,然后我编写了另一个小测试程序,将树加载回内存,我发现它需要的内存(5G)几乎是磁盘大小的10倍,这正常吗?避免这种情况的最好方法是什么 不,这不正常。我怀疑你的树比你想象的要大。编写一些代码来遍历它,并将使用的所有空间相加(并计算节点) 看 你到底在问什么?磁盘上的600M数据结构是5G内存,这让您感到惊讶吗。这并不特别令人惊讶。Pic

我将一些数据存储在内存中的树中,并定期使用pickle将树存储到磁盘中。
最近我注意到程序使用了一个大内存,然后我检查了保存的pickle文件,它大约是600M,然后我编写了另一个小测试程序,将树加载回内存,我发现它需要的内存(5G)几乎是磁盘大小的10倍,这正常吗?避免这种情况的最好方法是什么

不,这不正常。我怀疑你的树比你想象的要大。编写一些代码来遍历它,并将使用的所有空间相加(并计算节点)

你到底在问什么?磁盘上的600M数据结构是5G内存,这让您感到惊讶吗。这并不特别令人惊讶。Pickle压缩数据,因此您希望它在磁盘上更小。它大约小了10倍,这很好


如果你对自己数据的大小感到惊讶,那是另一回事。

我很惊讶文件在磁盘上有600万,但加载到内存需要5克,你说pickle会压缩它,这是有道理的。但它提出了另一个问题,树基本上是一个用于存储url(字符串)的前缀树(trie),它不应该比直接在磁盘中存储所有url大,对吗?压缩后,它只能更小,但有时,树比url列表文件大(我没有在树中存储其他内容)。顺便说一句,谢谢你的回复,链接也非常有用。树比存储列表占用(稍微)更多的空间。树必须具有所有的树结构信息,以及如果只存储一个列表,您将存储的信息。树和其他数据结构代表了时间与空间的权衡。您可以以牺牲时间为代价节省空间,反之亦然(您可以在存储数据或检索数据时节省时间)。如果数据的树形版本大得多,我会感到惊讶。存储在每个树节点中的数据越小,树结构开销就越大。另一件要注意的事情是不平衡的树木。。但它们不应该给你造成你所看到的尺寸问题。也可以看到这篇文章。(尽管pickle对于复杂的python数据结构很好),我将计算内存以查看结果。的确,每个节点中只有一个字符串(几个字符),节点数的幂为7~8。这可能就是原因。在此之前,我还有一个问题,我在网上搜索过,它说pickle不是线程安全的,所以如果我在写新东西的时候把它扔了,会发生什么?