【问题标题】:Saving a variable as it is in the memory to a file将内存中的变量原样保存到文件中
【发布时间】:2017-12-05 18:08:12
【问题描述】:

我有一本 2280 字节的字典,根据

sys.getsizeof(myDictionary)

当我用 pickle 将它保存到文件时

with open("dictionary.txt", "wb") as fp:   #Pickling
    pickle.dump(myDictionary, fp)

突然变成 100KB 大小

我是否可以获取该字典的确切二进制表示并将其保存到文件中? 然后再以字典的形式访问这个文件?

或者如果它不可能,也许它可以用另一种编程语言?使该文件尽可能小很重要

【问题讨论】:

  • 使用pickle而不是json.dump的任何具体原因?
  • 你的字典里有什么?在我的机器上,getsizeof({1: [""]})getsizeof({1: [s]}) 相同,其中 s 是一些非常大的字符串。 dict的大小可能与dict内容的大小无关,会体现在pickle输出的大小上

标签: python dictionary pickle


【解决方案1】:

来自docs 的关于sys.getsizeof 的引述:

只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。

嗯,Python 中的对象很多引用了其他对象,所以getsizeof 在这里可能帮不上什么忙。

例如:

>>> a = {'a': 1, 'b': 2}
>>> sys.getsizeof(a)
240 # WUT
len(pickle.dumps(a))
28 # looks legit

然后做:

>>> p = [1,2,3,4,5]
>>> a['k'] = p
>>> sys.getsizeof(a)
240 # WUT
>>> len(pickle.dumps(a))
51 # looks legit

所以,这个对象消耗的内存量显然取决于表示。如果您只想保存字典,那么您必须只保存一堆指向基本上无处的指针(因为当您加载保存的数据时,它们将无效)。您可以使用this recursive recipe 查找对象的大小及其内容。

如果您希望文件尽可能小,请考虑压缩字典中的值或使用不同的数据表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2014-04-24
    • 2018-11-23
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多