我有两种类型的文件。其中一个是ASCII文件,数据存储如下;
X Y Value
0 0 5154,4
1 0 5545455;
. . ...
. . ...
另一个是二进制文件。
我先使用StreamReader
和ReadLine()
方法解析第一个,然后按double[,]
将值设置为Split(' ')
数组。
我用BinaryReader
解析第二个。
二进制文件的解析速度比ASCII速度快3-4倍。
问题1:读取ASCII文件比二进制文件慢。这是正常的吗?
问题2:您是否建议另一种解析ASCII文件的方法?
答案 0 :(得分:3)
读取ASCII文件和二进制文件没有什么不同,不同的是解析它们,读取ASCII文件后解析字符串加倍,这就得到了处理时间。但是在二进制文件中你的读取数据流完全等于等效的二进制双数而不需要解析。
答案 1 :(得分:3)
读取ascii并不是那么慢,但是你是怎么做的。
它正在解析,寻找新行,分隔符,然后将文本位转换为其他格式。 BinaryReader基本上是一个直接的内存副本。
这就像固定长度和csv,或csv和xml之间的差异你添加的元数据越多,你可以获得的越多,但它的成本就越高。
逐个字符地读取ascii文件可能比readline和split更快,因为您可以针对特定的文件结构对其进行优化。虽然工作很多而且非常脆弱,这使得它成为一个可疑的前景。将负载加载到单独的线程甚至可能并行处理线路,可能更有价值,绝对更令人满意和可重复使用。
答案 2 :(得分:0)
每月一次我们收到一个350 MB的csv文件,包含350万行,然后我们用它一次读取一行并制作一些索引,它需要aprox。每次重新启动服务时间为60秒。
我制作了一个程序,将其煮沸至170万行,并将其转换为二进制格式,大约为24 MB。
这些数据直接读入内存中。 ms,并在需要时生成索引,并在使用时转换数据。
内存消耗从400 MB减少到90 MB。
重点是,如果性能,您应该为数据选择合适的格式是一个问题,还要注意这个解决方案是唯一可行的,因为数据是相当静态的,并且数据在24小时内检索的次数不会超过几百万次。
我相信新服务实际上回答的速度要快一些现在比过去。