C# ASCII文件解析速度

C# ASCII文件解析速度,c#,parsing,ascii,C#,Parsing,Ascii,我有两种类型的文件。其中一个是ASCII文件,数据存储方式如下: X Y Value 0 0 5154,4 1 0 5545455; . . ... . . ... 另一个是二进制文件 我使用StreamReader和ReadLine()方法解析第一个,然后通过Split(“”)将值设置为double[,]数组 我用BinaryReader解析第二个 二进制文件的解析速度是ASCII文件的3-4倍 问题1:读取ASCII文件比读取二进制文件慢。这正常吗 问题2:您是否建议解析ASCII文件的

我有两种类型的文件。其中一个是ASCII文件,数据存储方式如下:

X Y Value 
0 0 5154,4
1 0 5545455;
. . ...
. . ...
另一个是二进制文件

我使用
StreamReader
ReadLine()
方法解析第一个,然后通过
Split(“”)
将值设置为
double[,]
数组

我用
BinaryReader
解析第二个

二进制文件的解析速度是ASCII文件的3-4倍

问题1:读取ASCII文件比读取二进制文件慢。这正常吗


问题2:您是否建议解析ASCII文件的另一种方法

从ASCII文件读取数据和二进制数据没有区别,不同的是解析它们,在读取ASCII文件后,将字符串解析为双精度,这就是处理时间。但在二进制文件中,读取的数据流完全等于等效的二进制双精度数,不需要解析

从ASCII文件读取数据和二进制数据没有区别,不同的是解析它们,在读取ASCII文件后,将字符串解析为双精度,这就是处理时间。但在二进制文件中,读取的数据流完全等于等效的二进制双精度数,不需要解析

并不是说ascii的读取速度慢,而是你如何做到这一点

它进行解析,寻找新行、分隔符,然后将文本位转换为其他格式。BinaryReader基本上是一个直接的内存拷贝

这就像固定长度和csv,或csv和xml之间的区别添加的元数据越多,可以获取的数据越多,但成本越高


逐个字符读取ascii文件可能比读取行和拆分更快,因为您可以针对特定的文件结构对其进行优化。尽管有很多工作要做,而且非常脆弱,这使得它的前景令人怀疑。将加载加载到一个单独的线程,甚至并行处理这些行,可能会更有价值,肯定会更令人满意和可重用。

不是说读取ascii的速度慢,而是如何做到这一点

它进行解析,寻找新行、分隔符,然后将文本位转换为其他格式。BinaryReader基本上是一个直接的内存拷贝

这就像固定长度和csv,或csv和xml之间的区别添加的元数据越多,可以获取的数据越多,但成本越高


逐个字符读取ascii文件可能比读取行和拆分更快,因为您可以针对特定的文件结构对其进行优化。尽管有很多工作要做,而且非常脆弱,这使得它的前景令人怀疑。将加载到一个单独的线程,甚至并行处理这些行,可能会更有价值,肯定会更令人满意,更易于重用。

每月一次,我们会收到一个350 MB的csv文件,包含350万行,然后我们习惯于一次读取一行并制作一些索引,这需要大约一个月的时间。每次重新启动服务时60秒。
我制作了一个程序,将其压缩到170万行,并将其转换为大约24 MB的二进制格式。
这些数据在7毫秒内直接读取到内存中,在需要时生成索引,在使用时转换数据。
内存消耗从400 MB下降到90 MBMB。
关键是,如果性能有问题,您应该为数据选择适当的格式,另请注意,此解决方案之所以可行,是因为数据是相当静态的,并且在24小时内检索数据的次数不会超过数百万次。
我相信新服务现在的响应速度实际上比以前快了一点。

每月一次,我们会收到350 MB的csv文件,其中包含350万行,然后我们一次读一行,然后做一些索引,花了一点时间。每次重新启动服务时60秒。
我制作了一个程序,将其压缩到170万行,并将其转换为大约24 MB的二进制格式。
这些数据在7毫秒内直接读取到内存中,在需要时生成索引,在使用时转换数据。
内存消耗从400 MB下降到90 MBMB。
关键是,如果性能有问题,您应该为数据选择适当的格式,另请注意,此解决方案之所以可行,是因为数据是相当静态的,并且在24小时内检索数据的次数不会超过数百万次。
我相信新服务现在的响应速度实际上比以前快了一点。

读取文本并解析文本以将数据转换为二进制比读取二进制要慢直接的。3-4倍的速度并不是不可能的,尤其是当文件被缓存时(从而大大减少了I/O时间)。向我们展示您用于解析的代码。在任何一种情况下,您都应该在解析之前将整个流读入内存。@davidlive-为什么?然后他会测量完全不同的东西;对于一个大文件(对于此类数据来说并非不合理),它甚至可能不实用。您在比较什么?相同数量的双倍还是相同数量的字节?您是否对缓存进行了补偿?仅当文件较小时,才读取整个文件。ReadToEnd之后是Split(Environment.NewLine)和Readline,这是一个可疑的权衡。如果需要取消/中断/倒带,则更糟糕。读取文本并对其进行解析以将数据转换为二进制比直接读取二进制要慢。3-4倍的速度并不是不可能的,尤其是当文件被缓存时(从而大大减少了I/O时间)。向我们展示您用于解析的代码。在任何一种情况下,您都应该在解析之前将整个流读入内存。@davidlive-为什么?然后他会测量完全不同的东西;对于一个大文件(对于此类数据来说并非不合理),它甚至可能不实用。您在比较什么?相同数量的双倍还是相同数量的字节?您是否对缓存进行了补偿?仅当文件较小时,才读取整个文件。ReadToEnd之后是Split(Environment.NewLine)和Readline,这是一个可疑的权衡。更糟糕的是,如果你需要一个ca