【发布时间】:2022-10-24 21:06:05
【问题描述】:
我有一个大 (>10GB) 文件,它是一个 InfluxDB 线路协议导出。线路协议格式大致是
measurement,tag1=value1,tag2=value2,... value=XXX timestamp
例如
deconz.0.Sensors.10.pressure value=998 1622621407241000000
deconz.0.Sensors.10.pressure value=999 1622621970836000000
deconz.0.Sensors.10.pressure value=999 1622624177180000000
deconz.0.Sensors.10.pressure value=999 1622625419255000000
deconz.0.Sensors.10.pressure value=998 1622625975843000000
deconz.0.Sensors.11.battery value=85 1622621407241000000
deconz.0.Sensors.11.battery value=88 1622623616070000000
deconz.0.Sensors.11.battery value=88 1622660536826000000
deconz.0.Sensors.11.battery value=85 1622663594301000000
deconz.0.Sensors.11.battery value=88 1622666692089000000
deconz.0.Sensors.11.temperature value=21.44 1622621407241000000
deconz.0.Sensors.11.temperature value=21.61 1622646781032000000
deconz.0.Sensors.11.temperature value=21.64 1622650221200000000
deconz.0.Sensors.12.humidity value=55.54 1622621407242000000
deconz.0.Sensors.12.humidity value=55.7 1622633302339000000
deconz.0.Sensors.12.humidity value=55.73 1622636722283000000
deconz.0.Sensors.12.humidity value=55.89 1622640061715000000
deconz.0.Sensors.12.humidity value=55.96 1622643481822000000
deconz.0.Sensors.13.battery value=85 1622621407242000000
deconz.0.Sensors.13.battery value=85 1622908043752000000
deconz.0.Sensors.13.temperature value=24.01 1622621407242000000
deconz.0.Sensors.13.temperature value=24.13 1622626969228000000
deconz.0.Sensors.13.temperature value=24.21 1622630216027000000
deconz.0.Sensors.13.temperature value=24.33 1622630974954000000
deconz.0.Sensors.14.humidity value=47.72 1622632937200000000
deconz.0.Sensors.14.humidity value=47.8 1622633311833000000
deconz.0.Sensors.14.humidity value=46.7 1622636659393000000
deconz.0.Sensors.15.pressure value=1002 1622673441206000000
deconz.0.Sensors.15.pressure value=1002 1622685777307000000
deconz.0.Sensors.15.pressure value=1003 1622686242842000000
deconz.0.Sensors.16.temperature value=23.47 1622654455194000000
deconz.0.Sensors.16.temperature value=23.55 1622655939005000000
deconz.0.Sensors.16.temperature value=23.57 1622655959670000000
energymeter_total,uuid=c4695262-624c-11ea-b2f7-374e5ccddc43 value=30436.6 1622594844107000000
energymeter_total,uuid=c4695262-624c-11ea-b2f7-374e5ccddc43 value=30436.6 1622594908800000000
energymeter_total,uuid=c4695262-624c-11ea-b2f7-374e5ccddc43 value=30436.6 1622594973493000000
energymeter_total,uuid=c4695262-624c-11ea-b2f7-374e5ccddc43 value=30436.6 1622595158917000000
energymeter_total,manual=true value=26984.9 1592641140000000000
我想通过测量来分割这个文件,即。直到第一个逗号或空格,使用测量名称作为目标文件名。
这可以完成工作(逗号作为分隔符除外)但速度非常慢(在带有 SSD 存储的 Intel i5 上运行 8 小时):
cat ../influx_export | while read FILE VAL TS ; do echo "$FILE $VAL $TS" >> "$FILE" ; done
我确信有一个至少快 10 倍的脚本解决方案(无编译代码)。但是,源文件太大而无法完全放入 RAM。
有没有使用 awk、perl、sed、ruby 等更有效的方法?
【问题讨论】:
-
到目前为止,您所写的内容可能意味着一些不同的事情。如果您 edit 您的问题包括 minimal reproducible example 简洁、可测试的样本输入和预期输出,那么我们可以为您提供帮助。
-
输入文件是否已经按
measurement排序?如果没有,您是否大致了解我们必须处理多少个独特的measurements(又名文件名)?多行是否可以具有相同的measurement,如果是,是否所有具有相同measurement的行都分组在一起? -
请使用更多示例数据更新问题(例如,5-10 行,3-4 个不同的
measurements;带有多个标签/值对的几行);还使用预期结果更新问题(即,应生成的所有文件的名称和内容 - 对应于示例输入) -
@markp-fuso,我希望单行就足够了。但我会再追加一些。感谢您的链接。该文件未排序(实际上,它是按时间戳排序的,但我不想依赖它)并且有大约 300 个独特的测量值。
-
哦,哇,还有@ed-morton - 感谢您的冗长解释。使用 awk 我的 Haswell i5 能够在大约 5 分钟内完成任务。即使没有更多的调整。
标签: bash performance influx-line-protocol