3

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

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

我想做的是:

  1. 将所有现有数据读入 python 数组
  2. 将变量数组保存到某种数据库/文件
  3. 然后,下次添加更多数据时,我会加载我的数据库,附加新数据并重新保存它。这样,任何时候只需要处理少量数据。
  4. 我希望保存的数据可以被进一步的 python 脚本访问,但也可以相当“人类可读”,以便可以在 OriginPro 甚至 Excel 等程序中处理它。

我的问题是:保存数据的最佳格式是什么?HDF5 似乎具有我需要的所有功能——但是像 SQLite 这样的东西会更有意义吗?

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

4

3 回答 3

2

HDF5是一个绝佳的选择!它有一个漂亮的界面,被广泛使用(至少在科学界),许多程序都支持它(例如 matlab),有 C、C++、fortran、python 的库......它有一个完整的工具集显示 HDF5 文件的内容。如果您以后想对数据进行复杂的 MPI 计算,HDF5 支持并发读/写。它非常适合处理非常大的数据集。

于 2012-05-30T13:12:42.590 回答
2

也许您可以使用某种键值数据库,例如 Redis、Berkeley DB、MongoDB ......但如果您能提供更多关于您将使用的模式的信息,那就更好了。

已编辑

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

列表的最大长度为 232 - 1 个元素(4294967295,每个列表超过 40 亿个元素)。从时间复杂度的角度来看,Redis Lists 的主要特点是支持恒定时间插入和删除靠近头部和尾部的元素,即使插入了数百万个元素。访问列表的极端附近的元素非常快,但如果您尝试访问一个非常大的列表的中间,则速度很慢,因为这是一个 O(N) 操作。

于 2012-05-29T13:38:36.767 回答
0

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

于 2012-05-29T15:27:44.617 回答