【问题标题】:How should I read/write a data structure containing large arrays?我应该如何读/写包含大数组的数据结构?
【发布时间】:2016-10-14 08:01:52
【问题描述】:

我从服务器获取大量数据。我将它存储在字典和多维数组的组合中,它将用于简单的绘图。它看起来像:

>> print(data)
{'intensity_b2': [array([  1.46562588e+09,   1.46562588e+09,   1.46562588e+09, ...,
     1.46566369e+09,   1.46566369e+09,   1.46566369e+09]), array([ 0.,  0.,  0., ...,  0.,  0.,  0.])]}
>> print(len(data['intensity_b2'][0]))
37071

为了避免每次运行脚本时都获取数据,我想将此数据结构保存到文件中。我尝试将数据存储为

with open("data.dat", 'w') as f:
    f.write(str(data))

并阅读它

with open(data_store, 'r') as f:
    data = ast.literal_eval(f.read())

建议here。但是,我得到一个错误

ValueError:错误的节点或字符串:<_ast.call object at>

我怀疑这是因为数据与... 一起存储,如第一个打印输出所示(即上面的第一个print(data) 实际上是数据在文件中的样子)。如何将具有大数组的字典写入文件并随后读取?

【问题讨论】:

    标签: python arrays dictionary file-io


    【解决方案1】:

    您可以使用pickle 正确处理序列化:

    In [23]: a
    Out[23]: 
    {'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]),
      array('f', [1465663744.0, 1465663744.0, 1465663744.0])]}
    
    In [24]: pickle.dump(a, open('foo.p', 'wb'))
    
    In [25]: aa = pickle.load(open('foo.p', 'rb'))
    
    In [26]: aa
    Out[26]: 
    {'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]),
      array('f', [1465663744.0, 1465663744.0, 1465663744.0])]}
    

    这正是您想要做的:将您的数据结构保存到一个文件中,然后从该文件中读取它。

    但是,您似乎在重新发明轮子。您可能想看看numpypandas

    【讨论】:

    • 感谢您的回答。重新发明轮子怎么会这样?数据将纯粹用于绘图。
    • 根据您提供的详细信息进行猜测,您从远程服务器接收数据,然后将其转换为嵌套数组的字典,然后将其保存到文件中。 pandasnumpy 提供高效的数据结构来存储大型数据集。您不必构建数组字典,可以使用numpy.arraypandas.DataFrame。这两个模块都有内置工具来处理序列化和保存到文件,pandas(比numpy 更高级别的模块)可以将数据转换为几乎任何格式(json、csv、....) .
    • @pingul 这取决于您在从服务器接收数据并将其保存到文件中(以及您是否在 python 中构建绘图)之间的具体操作。我只是说,如果您进行一些数据操作,pandas 可能已经有一个内置工具。
    • 我实际上调用了一个 python API,它已经提供了如图所示的信息。没有对重要性进行修改。非常感谢您的意见。
    【解决方案2】:

    您的问题是str 不是序列化数据的合适方法。通常,对象将具有一个字符串表示形式,可以让人们理解它们是什么。对于原始对象,您甚至可以通过eval 获取等效对象的格式,但通常情况并非如此。

    您需要决定如何序列化数据。你可以使用JSON 之类的东西,但是你需要弄清楚如何也从原始数据类型转换对象,而且我认为你已经很清楚你不只是使用原始数据类型。

    您可能希望使用pickle 创建数据的序列化版本,稍后您可以将其解压并取回相同的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2012-10-10
      • 2023-03-07
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多