从线性信息实现CSV生成器的方法
本文关键字:方法 CSV 线性 信息 实现 | 更新日期: 2023-09-27 18:28:52
我遇到了一个伪代码问题。我有一个二进制文件,以一定的记录速率(20Hz、40Hz等)记录的可变数据。这个信息在文件中是线性的。例如,如果我有var1和var2,我会从文件中读取var1的数据,然后是var2的数据,再是var1的下一个样本,等等……我很确定构建CSV的最佳方式是逐行读取。我最初的想法是读取二进制文件,并将信息解析为当代的缓冲区/结构。读取完所有二进制数据后,开始逐行写入CSV文件。我对这种方法唯一关心的是内存消耗。记录的参数可以在300-400之间,最高可达160HZ。这是要存储的大量数据。我想知道是否还有其他更有效的方法。我使用的语言是C#
据我所知,您有:
{ some large number of var1 samples }
{ some large number of var2 samples }
{ some large number of var3 samples }
你想创建:
var1, var2, var3, etc.
var1, var2, var3, etc.
如果你有足够的内存来保存所有的数据,那么你的第一个方法就是方法。
只有你才能说你是否有足够的记忆力。如果文件都是二进制数据(即整数、浮点、双精度等),那么只需查看文件的大小就可以很好地了解需要多少内存。
假设您没有足够的内存来同时保存所有数据,您可以轻松地分两次处理数据。
在第一次传递中,读取所有var1
数据,并立即将其写入一个名为var1Data
的临时文件。然后对var2
、var3
等执行相同操作。完成第一次传递后,您有N个二进制文件,每个文件都包含该变量的数据。
第二步是打开所有这些文件,然后循环:
while not end of data
read from var1Data
read from var2Data
read from var3Data
etc.
create structure
write to CSV
或者,你可以这样做:
while not end of data
read from var1Data
write to CSV
read from var2Data
write to CSV
etc.
诚然,这是对数据的两次传递,但如果你不能将所有数据都放入内存,那就只能这样了。
一个缺点是您将同时打开300或400个文件。这应该不是问题。但还有另一种方法。
在第一次通过时,将每个参数的前100000个值读入内存,创建结构,并将其写入CSV。然后对文件进行另一次传递,将每个参数的100000到199999项读取到内存中,并附加到CSV中。直到处理完整个文件。
这可能更容易,具体取决于二进制文件的结构。如果您知道每个参数的数据在文件中的起始位置,并且该参数的所有值大小相同,则可以直接查找该参数的起始位置(或该参数的第100000个条目),然后开始读取。一旦您读取了var1
的任意多个值,就可以直接查找var2
数据的开头并从那里开始读取。您跳过未准备好在此通行证中处理的数据。
使用哪种方法将取决于您有多少内存以及数据的结构。正如我所说,如果这一切都能记住,那么你的工作就很容易了。如果它不适合内存,那么如果二进制文件的结构正确,你可以对输入文件进行多次遍历,每次遍历时跳过你不想要的数据。否则,你可以使用多文件方法,也可以对输入执行多次遍历,按顺序读取(即不跳过数据)。