将传感器数据写入磁盘,同时最小化磁盘写入总数和总文件大小



我每15秒收集几个渲染节点的传感器数据,我计划让这个数据收集无限期地运行。数据的分辨率不是特别高,并且包含很多重复的值,所以压缩它是有意义的

POLL_EVERY = 15.0 # seconds
DATANAME = 'sensor_data.parquet'
columns = ['timestamp', 'machine', 'load', 'freq', 'watts', 'temp', etc (many other columns)]
if not os.path.isfile(DATANAME):
data = {jj:[] for jj in columns}
df = pandas.DataFrame.from_dict(data)
else:
print("Reading parquet...")
df = pandas.read_parquet(DATANAME)
while True:
for machine in machines:
data = get_data(machine)
newrow = pandas.DataFrame([data], columns=columns)
df = pandas.concat([df, newrow])

print("Writing parquet...")
df.to_parquet(DATANAME, compression = 'brotli', index=False)

time.sleep(POLL_EVERY)

我担心的是,随着.parquet文件的大小增长,每次将其写入磁盘(就像我在上面的示例中所做的那样(都会变得越来越慢(还会浪费SSD上的大量有限写入(。理想情况下,我只需每次将额外的数据附加到文件中,这样它就不会在每次轮询机器以获取新信息时再次将整个历史记录写入磁盘。

问题是,这种方法需要对数据进行压缩(我认为(,并且使用brotli压缩可以显著节省文件大小(大约是未压缩csv文件大小的1/20(。

为了最大限度地减少不必要的写入,同时在监视了几个月/几年后又不会产生一个巨大的千兆字节文件,最好的方法是什么我想尽可能多地保留这段历史。

我正在考虑可能保留一个未压缩的csv文件,并将其附加到其中一段时间,然后有一个单独的线程来监控其文件大小,并最终将其附加在现有的镶木地板文件中,一旦csv变得太大,该文件将保留大部分历史记录。这样,它只是偶尔重新写入整个历史,并且仍然压缩了大部分数据。

但也许还有比这更好的方法。

有什么建议吗?

看看gzlog。它将shorts序列附加到未压缩的gzip文件中,一旦附加的数量足够大,它就会对其进行压缩。在每个步骤中,日志文件都是一个有效且完整的gzip文件。此外,还提供了防止因流程中断而导致腐败的保护措施。

相关内容

  • 没有找到相关文章

最新更新