【问题标题】:How do I read binary pickle data first, then unpickle it?如何先读取二进制泡菜数据,然后再取消泡菜?
【发布时间】:2010-05-04 09:47:09
【问题描述】:

我正在解开磁盘上大小约为 1GB 的 NetworkX 对象。虽然我将它保存为二进制格式(使用协议 2),但解封该文件需要很长时间——至少半小时。我运行的系统有足够的系统内存(128 GB),所以这不是瓶颈。

我已经读过here,可以通过首先将整个文件读入内存,然后将其取消酸洗来加速酸洗(该特定线程指的是我没有使用的 python 3.0,但重点应该仍然是在 python 2.6 中是正确的)。

如何先读取二进制文件,然后解压它?我试过了:

import cPickle as pickle
f = open("big_networkx_graph.pickle","rb")
bin_data = f.read()
graph_data = pickle.load(bin_data)

但这会返回:

TypeError: argument must have 'read' and 'readline' attributes

有什么想法吗?

【问题讨论】:

    标签: python serialization pickle


    【解决方案1】:

    pickle.load(file) 需要一个类似文件的对象。相反,使用:

    pickle.loads(string)

    从字符串中读取腌制对象层次结构。字符串中超出腌制对象表示的字符将被忽略。

    【讨论】:

    • 这似乎有效。我认为这不起作用,因为“加载”意味着“加载字符串”,而我正在加载的数据是二进制的。但是因为我以二进制形式读取文件,所以我提供给它的字符串也是二进制的,所以一切正常。谢谢。
    • @conradlee:Python 字符串支持二进制数据,因此无需区分。
    • TypeError: 需要一个类似字节的对象,而不是'str'
    【解决方案2】:

    文档中提到了StringIO,我认为这是一种可能的解决方案。

    试试:

    f = open("big_networkx_graph.pickle","rb")
    bin_data = f.read()
    sio = StringIO(bin_data)
    graph_data = pickle.load(sio)
    

    【讨论】:

    • 这行得通,但是因为它需要导入 StringIO,所以它比 gimel 的解决方案更复杂——这就是为什么我将答案归功于他。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2018-11-01
    • 2018-07-29
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多