[英]Fastest way to read very large text file in C#
我有一个非常基本的问题。 我有几个文本文件,每个文件的大小都是几GB。 我有一个C#WPF应用程序,我用它来处理类似的数据文件,但没有接近那个大小(现在可能大约200-300mb)。 我怎样才能有效地读取这些数据,然后在处理之后将其写入其他地方,而不会冻结和崩溃? 从根本上说,从一个非常大的文件读取的最佳方式是什么? 对于我的小规模应用,现在,我用System.IO.File.ReadAllLines
阅读和streamwriter
写。 我敢肯定这两种方法不适合这种大文件。 我对C#没有多少经验,任何帮助将不胜感激!
如果你可以逐行完成这个,那么答案很简单:
如果你想要它更快一点,把它们放在三个BlockingCollections
,指定上限为10,这样一个较慢的步骤永远不会等待更快的步骤。 如果可以输出到不同的物理光盘(如果输出到光盘)。
即使在询问该过程是否是逐行(两次)后,OP也改变了规则。
这可能是某种重叠的转换。
https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx
首先,您需要将目标文件分配为与估计值接近的结果大小。 在大多数情况下,过冲可能比下冲更可取,您可以始终截断到给定长度,但增长可能需要非连续分配。 如果预计会出现过度增长,您可以将文件分配为“稀疏”文件。
选择大于或等于512字节的任意(可能是二进制功率)块大小(测试以找到最佳性能)。
映射源文件的2个块。 这是你的源缓冲区。
映射目标文件的2个块。 这是您的目标缓冲区。
在一个街区内的线上操作。 从源块读取,写入目标块。
转换块边界后,执行“缓冲区交换”以交换下一个块的先前已完成块。
有几种方法可以完成这些任务。
如果您愿意,您可以一次分配更多的块用于操作,但您需要应用重叠操作的“三重缓冲”策略来使用。 如果写入比读取慢得多,您甚至可以使用与三重缓冲相同的模式实现无界内存缓冲。
根据您的数据,您也可以将块分发到单独的线程,即使它是“基于行”的文件。
如果每一行都依赖于先前的数据,则可能无法加速操作。 如果不是,则在执行操作之前索引文件中的行将允许多个工作线程,每个线程在独立块上操作。
如果我需要详细说明任何事情,请说明哪一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.