对于我遇到的问题,我有一个伪代码问题。我有一个记录可变数据的二进制文件,在某些记录速率(20Hz,40Hz等)。此信息在文件中是线性的。例如,如果我有var1和var2,我会从文件var1的数据读取,然后读取var2的数据,然后读取var1的下一个样本等等......我非常确定构建CSV的最佳方法是按行。我最初的想法是只读取二进制文件并将信息解析为当代缓冲区/结构。读入所有二进制数据后,开始逐行写入CSV文件。我唯一担心的是这种方法是内存消耗。可记录高达160HZ的300-400个参数。这是存储的大量数据。我想知道是否还有其他更有效的方法。我正在使用的语言是C#
答案 0 :(得分:1)
据我所知,你有:
{ 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个文件。这应该不是问题。但还有另一种方法可以做到。
在第一遍中,将每个参数的前100,000个值读入内存,创建结构并将其写入CSV。然后对文件进行另一次传递,将每个参数的项目100,000到199,999读入内存并附加到CSV。在您处理完整个文件之前,请执行此操作。
这可能会更容易,具体取决于二进制文件的结构。如果您知道每个参数的数据在文件中的起始位置,并且该参数的所有值都是相同的大小,那么您可以直接查找该参数的开头(或该参数的第100,000个条目),然后开始阅读。一旦你阅读了var1
的许多值,你就可以直接找到var2
数据的开头并从那里开始阅读。您可以跳过此传递中尚未准备好处理的数据。
使用哪种方法取决于您拥有多少内存以及数据的结构。正如我所说的,如果这一切都适合记忆,那么你的工作就很容易了。如果它不适合内存,那么如果二进制文件结构正确,你可以通过输入文件多次传递,在每次传递上跳过你不想要传递的数据。否则,您可以使用多文件方法,或者您可以对输入进行多次传递,顺序读取(即不跳过数据)。