从线性信息实现CSV生成器的方法

本文关键字:方法 CSV 线性 信息 实现 | 更新日期: 2023-09-27 18:28:52

我遇到了一个伪代码问题。我有一个二进制文件,以一定的记录速率(20Hz、40Hz等)记录的可变数据。这个信息在文件中是线性的。例如,如果我有var1和var2,我会从文件中读取var1的数据,然后是var2的数据,再是var1的下一个样本,等等……我很确定构建CSV的最佳方式是逐行读取。我最初的想法是读取二进制文件,并将信息解析为当代的缓冲区/结构。读取完所有二进制数据后,开始逐行写入CSV文件。我对这种方法唯一关心的是内存消耗。记录的参数可以在300-400之间,最高可达160HZ。这是要存储的大量数据。我想知道是否还有其他更有效的方法。我使用的语言是C#

从线性信息实现CSV生成器的方法

据我所知,您有:

{ 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的临时文件。然后对var2var3等执行相同操作。完成第一次传递后,您有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数据的开头并从那里开始读取。您跳过未准备好在此通行证中处理的数据。

使用哪种方法将取决于您有多少内存以及数据的结构。正如我所说,如果这一切都能记住,那么你的工作就很容易了。如果它不适合内存,那么如果二进制文件的结构正确,你可以对输入文件进行多次遍历,每次遍历时跳过你不想要的数据。否则,你可以使用多文件方法,也可以对输入执行多次遍历,按顺序读取(即不跳过数据)。