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

C# 从线性信息实现CSV生成器的方法,c#,algorithm,csv,C#,Algorithm,Csv,对于我遇到的一个问题,我有一个伪代码问题。我有一个二进制文件,以特定的记录速率(20Hz、40Hz等)记录变量数据。该信息在文件中是线性的。例如,如果我有var1和var2,我会读取文件var1的数据,然后是var2的数据,然后是var1的下一个示例,等等……我很确定构建CSV的最佳方法是按行。我最初的想法是读入二进制文件并将信息解析为一个当代的缓冲区/结构。读取所有二进制数据后,开始逐行写入CSV文件。我对这种方法唯一关心的是内存消耗。可记录300-400个高达160HZ的参数。要存储的数据太

对于我遇到的一个问题,我有一个伪代码问题。我有一个二进制文件,以特定的记录速率(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
数据的开头并从那里开始读取。您跳过了在此过程中未准备好处理的数据

使用哪种方法取决于您有多少内存以及数据的结构。正如我所说的,如果所有的记忆都能记住,那么你的工作就很容易了。如果二进制文件无法放入内存,那么如果二进制文件结构正确,您可以对输入文件进行多次传递,每次传递时跳过不需要的数据。否则,您可以使用multiple files方法,也可以对输入进行多次传递,按顺序读取(即不跳过数据)