为了账号安全,请及时绑定邮箱和手机立即绑定

在非常大的文件 C# 的所有行上循环

在非常大的文件 C# 的所有行上循环

C#
慕盖茨4494581 2021-11-28 19:45:42
我想循环使用一个非常大的文件(例如 10GB)的所有行 foreach我目前正在使用File.ReadLines这样的:var lines = File.ReadLines(fileName);foreach (var line in lines) {  // Process line}但是如果文件大于 2MB,这会非常慢,并且循环会非常缓慢。如何循环处理非常大的文件?任何帮助,将不胜感激。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

你这样做的方式是最好的方式,因为

  • 您不想一次将整个文件读入 RAM

  • 您的线路处理独立于以前的线路

抱歉,从硬盘读取内容很慢。

改进可能来自其他来源:

  • 将您的文件存储在更快的设备(SSD?)

  • 获得更多 RAM 以将文件读入内存以至少加快处理速度


查看完整回答
反对 回复 2021-11-28
?
千巷猫影

TA贡献1829条经验 获得超7个赞

首先,您需要读取整个文件还是仅读取文件的一部分。


如果您只需要读取文件的部分


const int chunkSize = 1024; // read the file by chunks of 1KB

using (var file = File.OpenRead("yourfile"))

{

    int bytesRead;

    var buffer = new byte[chunkSize];

    while ((bytesRead = file.Read(buffer, 0 /* start offset */, buffer.Length)) > 0)

    {

        // TODO: Process bytesRead number of bytes from the buffer

        // not the entire buffer as the size of the buffer is 1KB

        // whereas the actual number of bytes that are read are 

        // stored in the bytesRead integer.

    }

}

如果需要将整个文件加载到内存中。


重复使用此方法而不是直接加载到内存中,因为您可以控制正在执行的操作,并且可以随时停止该过程。


或者您可以使用https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx?f=255&MSPPError=-2147217396MemoryMappedFile


内存映射文件将提供从内存访问的程序视图,但它只会第一次从磁盘加载。


long offset = 0x10000000; // 256 megabytes

long length = 0x20000000; // 512 megabytes


// Create the memory-mapped file.

using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))

{

     // Create a random access view, from the 256th megabyte (the offset)

     // to the 768th megabyte (the offset plus length).

     using (var accessor = mmf.CreateViewAccessor(offset, length))

     {

         //Your process

     }

}


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 193 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信