将大型 Python 数组保存到磁盘以供以后重复使用 --- hdf5?还有啥方法?
Posted
技术标签:
【中文标题】将大型 Python 数组保存到磁盘以供以后重复使用 --- hdf5?还有啥方法?【英文标题】:Saving large Python arrays to disk for re-use later --- hdf5? Some other method?将大型 Python 数组保存到磁盘以供以后重复使用 --- hdf5?还有什么方法? 【发布时间】:2012-06-03 17:30:07 【问题描述】:我目前正在重写一些 python 代码以使其更高效,我有一个关于保存 python 数组以便以后可以重用/操作的问题。
我有大量数据,保存在 CSV 文件中。每个文件都包含我感兴趣的数据的时间戳值,并且我已经达到了必须处理数千万个数据点的地步。现在数据变得如此之大,以至于处理时间过多且效率低下——当前代码的编写方式每次添加一些新数据时都必须重新处理整个数据集。
我想做的是这样的:
-
将所有现有数据读入 python 数组
将变量数组保存到某种数据库/文件中
然后,下次添加更多数据时,我会加载我的数据库,添加新数据,然后重新保存。这样,任何时候都只需要处理少量数据。
我希望保存的数据能够被更多的 python 脚本访问,但也能够相当“人类可读”,以便可以在 OriginPro 甚至 Excel 等程序中进行处理。
我的问题是:保存数据的最佳格式是什么? HDF5 似乎拥有我需要的所有功能——但是像 SQLite 这样的东西会更有意义吗?
编辑:我的数据是一维的。我基本上有 30 个大小为(百万,1)的数组。如果不是因为有这么多点,那么 CSV 将是一种理想的格式!我不太可能想要查找单个条目——更有可能是我可能想要绘制数据的小子集(例如过去 100 小时或过去 1000 小时等)。
【问题讨论】:
您能否就您的问题提供一些更具体的信息?例如,数据的维度是多少。您是在处理包含少量元素的多个数组,还是处理包含大量元素的少量数组?您认为您需要对这些数据运行复杂的查询吗?如果您的数据是多维的,并且您可以从查询中受益,那么 SQLite 可能是有意义的。 我已按要求添加了一些信息。基本上我有少量的一维数组,但每个数组都有大约数百万个元素。 【参考方案1】:HDF5 是一个绝佳的选择!它有一个很好的界面,被广泛使用(至少在科学界),许多程序都支持它(例如 matlab),有 C、C++、fortran、python 的库......它有一个完整的工具集显示 HDF5 文件的内容。如果您以后想对数据进行复杂的 MPI 计算,HDF5 支持并发读/写。它非常适合处理非常大的数据集。
【讨论】:
似乎有很多选择,但出于您指定的原因,我会选择 HDF5 :-)【参考方案2】:也许您可以使用某种键值对数据库,例如 Redis、Berkeley DB、MongoDB……但最好能提供更多有关您将使用的架构的信息。
已编辑
例如,如果您选择Redis,您可以索引很长的列表:
列表的最大长度为 232 - 1 个元素(4294967295,超过 4 每个列表有十亿个元素)。 Redis Lists 的主要特点来自 时间复杂度的观点是对常数时间的支持 在头部和尾部附近插入和删除元素,即使使用 数以百万计的插入项目。访问元素非常快 列表的极端,但如果您尝试访问中间则很慢 一个非常大的列表,因为它是一个 O(N) 操作。
【讨论】:
【参考方案3】:我会为此用例使用具有固定记录长度的单个文件。没有专门的数据库解决方案(在这种情况下对我来说似乎有点过分),只是简单的旧 struct
(参见 struct.py 的文档)和文件上的 read()/write()。如果您只有数百万个条目,那么在几十或几百 MB 大小的单个文件中,一切都应该运行良好(这对于任何文件系统来说都不算太大)。您还可以随机访问子集,以备日后需要时使用。
【讨论】:
啊,我错过了“可读”部分 :- 也许你不想使用 struct.py 而是普通的旧 str()/int()/float()。当然,每个数组使用一个文件(你写了你有 30 个)。以上是关于将大型 Python 数组保存到磁盘以供以后重复使用 --- hdf5?还有啥方法?的主要内容,如果未能解决你的问题,请参考以下文章
将 html 保存到文件以供以后使用 Beautiful Soup 使用