python中时间序列数据的简单(但大)读/写
Posted
技术标签:
【中文标题】python中时间序列数据的简单(但大)读/写【英文标题】:Simple (but large) read/write of time series data in python 【发布时间】:2015-09-14 05:16:24 【问题描述】:在使用 python 存储简单的时间序列数据方面,我无法解决如何解决我的特定问题(可能是因为选项太多!)。
我要做的就是存储和访问一个非常长的 16 位整数的一维列表。我什至不一定需要存储索引,因为它可以从样本的顺序隐式推导出来。但我需要一个快速的追加操作。
问题是我希望有大约 100GB 的数据需要以 100M 样本/秒的速度动态记录到磁盘(我已经测试过,我的 SSD 设置可以处理 400- 500MB/秒写入),并且只有 ~14GB 的 RAM。我最初的想法是基本上以 100M 行的块将其写入单个 CSV 文件,但这似乎会浪费大量空间(一个 16 位整数最多可以占用 5 个字节作为字符串而不是 2 个)。其他想法包括使用 msgpack/npz/raw 二进制文件作为块,虽然我很乐意自己实现这一点,但我正在尝试找出是否已经存在解决方案。
由于我事先并不确切知道我需要的样本数量,我认为这意味着 numpy 的 memmap 不适合。
稍后,我还需要对两个索引之间的数据进行切片以进行处理,而无需将整个数据集加载到内存中。这不会在录制时发生,只会在录制之后发生。
我认为 pandas HDFStore 是我所追求的,但我不确定一些最佳实践。
具体来说,
-
给定一个非常简单的数据格式,在 pandas 中使用 HDFStore 的多个节点(每个块一个节点)与单个节点的含义是什么?如果前者更好,那么合适的块大小是多少?
HDFStore 是在 pandas 中进行磁盘支持的高性能顺序读写的最佳方式吗?随机访问并不重要。
我的问题是在熊猫领域吗?在这种情况下,熊猫对我来说似乎有点矫枉过正。
任何其他提示或建议将不胜感激。真的,我需要的是 python 中的列表对象,但它也支持快速分块到磁盘和从磁盘分块。
【问题讨论】:
这 100GB 的数据是即时生成的还是已经保存? 为什么不直接使用HDF5库,以后再拆分文件呢?看起来 Pandas 并没有给你带来任何好处。 @sihrc:它是通过一些硬件工具即时生成的。 @gandu:我在看 pytables,它是一个围绕 HDF5 的 python 包装器(也被 pandas 使用)。但也许这也太过分了? @jeremy 你最后选择了什么? 【参考方案1】:我公司的伦敦团队创建了北极。它使用 numpy 字节数组,用 lz4 压缩,并分成块发送到 mongodb。在波士顿,我们正在围绕此构建其他功能,但我们发现它非常有效。
它具有出色的性能,可以一次吞下整个东西。
https://github.com/manahl/arctic
看看它是否适合你。
【讨论】:
【参考方案2】:您也可以只使用一个原始二进制文件。如果您以块的形式写入数据,则开销应该很小。数据采集完成后,您可以对文件进行内存映射并切片。 numpy 数组示例:
import numpy as np
CHUNKSIZE = 2**24 # Requires tuning
def get_chunks_from_somewhere(n):
"""Generate dummy data."""
for _ in range(n):
yield np.random.randint(2**16, size=CHUNKSIZE).astype(np.uint16)
with open('temp.dat', 'wb') as fih:
for chunk in get_chunks_from_somewhere(100):
chunk.tofile(fih)
无论文件格式如何,我认为真正的问题是您必须异步写入磁盘,否则可能会阻止从仪器读取(?)。
【讨论】:
以上是关于python中时间序列数据的简单(但大)读/写的主要内容,如果未能解决你的问题,请参考以下文章