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中时间序列数据的简单(但大)读/写的主要内容,如果未能解决你的问题,请参考以下文章

python中时间序列数据的一些处理方式

R中时间序列数据的滑动时间间隔

标准化 bigquery 中时间序列数据条目之间的时间

R中时间序列数据的拆分应用聚合

Elasticsearches Timelion是Kibana中时间序列的可视化工具

填补Mysql查询中时间序列空白的最佳方法