将大型Python数组保存到磁盘以供以后重用--hdf5?还有别的方法吗?

将大型Python数组保存到磁盘以供以后重用--hdf5?还有别的方法吗?,python,database,arrays,save,hdf5,Python,Database,Arrays,Save,Hdf5,我目前正在重写一些python代码以提高效率,我有一个关于保存python数组以便以后可以重用/操作的问题 我有大量的数据,保存在CSV文件中。每个文件都包含我感兴趣的数据的时间戳值,我已经到了必须处理数千万个数据点的地步。现在数据变得如此之大,以至于处理时间过长且效率低下——按照当前代码的编写方式,每次添加新数据时,都必须重新处理整个数据集 我想做的是: 将所有现有数据读入python数组 将变量数组保存到某种数据库/文件中 然后,下次添加更多数据时,我加载数据库,附加新数据,然后重新保存。这

我目前正在重写一些python代码以提高效率,我有一个关于保存python数组以便以后可以重用/操作的问题

我有大量的数据,保存在CSV文件中。每个文件都包含我感兴趣的数据的时间戳值,我已经到了必须处理数千万个数据点的地步。现在数据变得如此之大,以至于处理时间过长且效率低下——按照当前代码的编写方式,每次添加新数据时,都必须重新处理整个数据集

我想做的是:

  • 将所有现有数据读入python数组
  • 将变量数组保存到某种数据库/文件中
  • 然后,下次添加更多数据时,我加载数据库,附加新数据,然后重新保存。这样,在任何时候只需要处理少量数据
  • 我希望保存的数据可以被进一步的python脚本访问,但也可以是相当“人类可读的”,以便可以在OriginPro或Excel之类的程序中处理 我的问题是:保存数据的最佳格式是什么?HDF5似乎具备了我所需要的所有功能——但像SQLite这样的东西更有意义吗


    编辑:我的数据是一维的。我基本上有30个数组,它们的大小是(百万,1)。如果不是因为有这么多点,CSV将是一种理想的格式!我不太可能想查找单个条目——更可能的是我想绘制数据的小子集(例如,过去100小时或过去1000小时等)

    也许你可以使用一些键值数据库,比如Redis、Berkeley DB、MongoDB。。。但是如果能提供更多关于您将要使用的模式的信息,那就太好了

    已编辑

    例如,如果您选择,您可以为很长的列表编制索引:

    列表的最大长度为232-1个元素(4294967295,大于4个) 每个列表有十亿个元素)。Redis列表的主要功能来自 时间复杂性的观点是对恒定时间的支持 在头部和尾部附近插入和删除元素,即使 数以百万计的插入项目。访问元素的速度非常快 列表的两个极端,但如果尝试访问中间部分,则速度较慢 一个非常大的列表,因为它是一个O(N)操作


    对于这个用例,我将使用固定记录长度的单个文件。没有专门的DB解决方案(在这种情况下对我来说似乎有些过分),只有简单的旧
    struct
    (请参阅struct.py的文档)和文件上的read()/write()。如果您只有数百万个条目,那么在一个几十或数百MB大小的文件中(对于任何文件系统来说都不会太大),所有内容都应该运行良好。您还可以随机访问子集,以备以后需要。

    HDF5是一个很好的选择!它有一个很好的接口,被广泛使用(至少在科学界),许多程序都支持它(例如Matlab),有C、C++、FORTRAN、Python、……库。它有一个完整的工具集来显示HDF5文件的内容。如果以后要对数据执行复杂的MPI计算,HDF5支持并发读/写。它非常适合处理非常大的数据集。

    您能提供一些关于您的问题的更具体的信息吗?例如,数据包含多少维度。您处理的是包含少量元素的多个数组,还是包含大量元素的少量数组?您认为需要对这些数据运行复杂的查询吗?如果您的数据是多维的,并且您可以从查询中受益,SQLite可能是有意义的。基本上我有一小部分一维数组,但每个数组都有~数百万个元素。啊,我错过了“可读”部分:-}也许你不想使用struct.py,但是简单的str()/int()/float()。当然,每个数组使用一个文件(您编写了30个)。似乎有很多选择,但我将使用HDF5,原因是您指定:-)