php - 存储60亿个 float ,方便文件访问

标签 php python file struct storage

我需要在 python 中使用 36000 个 [date, float, float, float] 小数组每小时保存 250 个数据文件,我可以用 PHP 轻松读取这些文件。这需要在 6tb 的存储空间上至少运行 10 年。

保存这些单独文件的最佳方式是什么,我在考虑 python struct。但是对于大数据量的工作来说,它开始看起来很糟糕吗?

数据示例

a = [["2016:04:03 20:30:00", 3.423, 2.123, -23.243], ["2016:23:.....], ......]

编辑: 空间,比解包速度和计算更重要。由于空间非常有限。

最佳答案

所以您有 250 个某种类型的数据提供者,它们每秒提供 10 个样本(float,float,float)。

由于您没有具体说明您的限制是什么,所以还有更多选择。


二进制文件

您可以使用 struct 编写 3*36000 个 float 的固定数组文件,每个文件有 4 个字节,每个文件有 432.000 个字节。您可以在目录名称中对小时进行编码,在文件名中对数据提供者的 ID 进行编码。

如果您的数据不是太随机,一个体面的压缩算法应该削减足够的字节,但如果您不想丢失数据,您可能需要某种延迟压缩。

NumPy

用结构打包的替代方法是 numpy.tofile ,它将数组直接存储到文件中。它速度很快,但总是以 C 格式存储数据,如果目标机器上的字节序不同,你应该注意这一点。用numpy.savez_compressed您可以在一个 npz 存档中存储多个数组,并同时压缩它。

JSON、XML、CSV

上述任何一种格式都是一个不错的选择。另外值得一提的是JSON-lines format ,其中每一行都是一个 JSON 编码的记录。这是为了启用流式写入,您可以在每次写入后保留有效的文件格式。

它们易于阅读,语法开销随着压缩而消失。只是不要进行字符串连接,使用真正的序列化程序库。

(SQL) 数据库

说真的,为什么不使用真实的数据库呢?

显然,您需要对数据进行一些处理。每秒 10 个样本,没有人会需要那么多数据,所以你必须进行聚合:最小值、最大值、平均值、平均值、求和等。数据库已经拥有所有这些,结合其他功能,它们可以为你节省一个大量的时间你可以花在写这么多脚本和文件抽象上。更不用说文件管理变得多么麻烦。

数据库是可扩展的,并受多种语言支持。您使用 Python 将日期时间保存在数据库中,您使用 PHP 读取日期时间。无需担心如何对数据进行编码。

数据库支持索引以加快查找速度。

我个人最喜欢的是 PostgreSQL,它有很多不错的特性。它支持BRIN index ,一种轻量级索引,非常适合具有自然排序字段(例如时间戳)的大型数据集。如果磁盘空间不足,可以使用 cstore_fdw 扩展它,一个面向列的数据存储,支持压缩。如果你仍然想使用平面文件,你可以写一个 foreign data wrapper ( also possible with Python) 并且仍然使用 SQL 访问数据。

关于php - 存储60亿个 float ,方便文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634339/

相关文章:

python - 如何仅在过去 365 天使用 group by 对 pandas 数据框执行滚动求和

java - 不考虑大小写来定位文件?

php - 如何在 gedit(windows 版本)上添加文件扩展名

php - Laravel ModelNotFoundException : No query results for model []

php - WAMPSERVER PHP MYSQL - (mysqlnd 5.0.10 错误)

php - 使用 curl 上传多个文件

python - 如何将纯文本标题和列表传输到 Python 字典对象?

python - 当我使用 os.system() 在 Python 中打开一个 .py 文件时,它会立即自动关闭它。我该如何解决?

Java - FileOutputStream 覆盖文件,但它似乎没有改变

Android:将图像存储到项目目录(文件)中?