【问题标题】:pickle and python data structure泡菜和python数据结构
【发布时间】:2016-03-18 22:42:25
【问题描述】:

我有一些数据存储在内存中的树中,我经常使用 pickle 将树存储到磁盘中。 最近注意到这个程序使用了很大的内存,然后我检查了保存的pickle文件,大约600M,然后我又写了一个小测试程序将树加载回内存,我发现它会占用将近10倍的内存( 5G)比磁盘大小,这正常吗?避免这种情况的最佳方法是什么?

【问题讨论】:

    标签: python pickle


    【解决方案1】:

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

    memory size of Python data structure

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

    如果您对自己数据的大小感到惊讶,那就另当别论了。

    【讨论】:

    • 我很惊讶文件在磁盘上是600M,但是加载到内存中需要5G,你说pickle会压缩它,这是有道理的。但是它又提出了另一个问题,树基本上是一个前缀树(trie),用于存储url(字符串),它不应该比直接将所有url存储在磁盘中大,对吧?压缩后只能变小,但有时树比url列表文件大(我没有在树中存储其他东西)。
    • 顺便说一句,谢谢你的回复,链接也很有用。
    • 树木比存储列表占用(一点)更多空间。树必须具有所有树结构信息以及如果您只存储一个列表将存储的信息。树和其他数据结构代表时间与空间的权衡。您可以以牺牲时间为代价来节省空间,反之亦然(您可以节省存储数据或检索数据的时间)。它不应该是一个巨大的数量更多。
    • 如果数据的树版本更大,我会感到惊讶。您存储在每个树节点中的数据越小,树结构开销就越大。另一件需要注意的事情是不平衡的树木。但它们不应该给你造成你所看到的大小问题。另见这篇文章。 benfrederickson.com/dont-pickle-your-data(虽然pickle对于复杂的python数据结构很有用)。
    • 我要计算内存看看结果。确实每个节点只有一个字符串(几个字符),节点数是7~8次方。这可能是原因。在此之前我还有一个问题,我在网上搜索,它说pickle不是线程安全的,那么如果我在向它写新东西的同时倾倒它会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2017-11-09
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多