我需要每小时保存250个数据文件,在python中有36000个小数组[date,float,float,float],我可以用PHP轻松阅读。这需要至少运行10年,存储量为6tb。
保存这些单独文件的最佳方法是什么,我在想python结构。但是对于数据量很大的工作来说,它开始变坏了吗?
数据示例
a = [["2016:04:03 20:30:00", 3.423, 2.123, -23.243], ["2016:23:.....], ......]
编辑: 空间,比解包速度和计算更重要。由于空间非常有限。
答案 0 :(得分:3)
所以你有250个某种数据提供者,每秒提供10个样本(浮点数,浮点数,浮点数)。
由于您没有指定您的限制,因此有更多选项。
二进制文件
您可以使用struct编写固定数组3 * 36000浮点数的文件,每个文件4个字节可获得432.000字节。您可以使用文件名中的数据提供程序的目录名和ID来编码小时。
如果您的数据不是太随机,一个不错的压缩算法应该削减足够的字节,但如果您不想丢失数据,则可能需要进行某种延迟压缩。
<强> numpy的强>
使用struct打包的替代方法是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来访问数据。
答案 1 :(得分:2)
除非您使用相同语言的文件,否则请避免使用特定于语言的格式和结构。总是
如果您使用的是两种或更多种语言,请使用常见的纯文本数据格式,例如JSON
或XML
,这些格式可以通过大多数语言和工具轻松(通常是原生)解析。
如果您遵循此建议并存储纯文本,则对存储的文件使用压缩 - 这就是节省空间的方式。典型结构良好的JSON
往往压缩得很好(假设文本内容简单)。
再次选择像gzip这样的压缩格式,这种格式受到语言或其核心库的广泛支持。例如,PHP有一个本机函数gzopen()
,而python在标准python库中有lib \ gzip.py。
答案 2 :(得分:1)
我怀疑没有非常有效的压缩是可能的。
6TB / 10 year/ 365 days / 24 hrs / 250 files = 270 KB per file.
理想情况。在群集事项的实际字大小。
如果你有36,000个“小数组”适合每个文件,那么每个数组只有7个字节,这还不足以单独存储正确的日期时间对象。
答案 3 :(得分:0)
如果你想节省空间,我会想到一个想法。您最好只存储值并丢弃时间戳。生成仅包含数据的文件,并确保您创建了一种索引(公式),给出时间戳(年/月/日/小时/分钟/秒......)会导致文件内部数据的位置(当然还有你要去的文件)。甚至,如果你检查两次,你会发现如果你使用&#34; smart&#34;您可以避免存储有关年/月/日/小时信息的文件的命名方案,因为索引的一部分可能是文件名。这一切都取决于你如何实现你的&#34;索引&#34;系统,但推到极端版本,你可以忘记时间戳,只关注数据。
关于数据格式,正如前面提到的,我绝对会继续使用XML,JSON等语言无关的格式......谁知道十年后你将拥有哪些语言和可能性;)