如何使用StreamReader以块的形式加载大文件?

时间:2017-04-24 18:05:05

标签: c#

我是使用C#读取文件数据的新手。我有一个大文本文件,其中的数据用逗号分隔。我想将此文件加载到我的应用程序(或域对象)中的DataTable,但在执行此操作时我得到OutOfMemoryException。我尝试了几种不同的方法,但仍然是同样的错误。似乎为了加载数据我需要以块的形式加载它,处理块然后存储它,然后获取下一个块然后处理它等等

如何使用StreamReader执行此操作?我如何告诉StreamReader在文件中读到哪里以及如何知道从哪里继续获取下一个块?

2 个答案:

答案 0 :(得分:2)

你可以使用Buffer Stream来读取块数据,这里是代码

private void ReadFile(string filePath)
{
    const int MAX_BUFFER = 20971520; //20MB this is the chunk size read from file
    byte[] buffer = new byte[MAX_BUFFER];
    int bytesRead;

    using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read))
    using (BufferedStream bs = new BufferedStream(fs))
       {
          while ((bytesRead = bs.Read(buffer, 0, MAX_BUFFER)) != 0) //reading only 20mb chunks at a time
              {
                   //buffer contains the chunk data Treasure the moments with it . . . 
                   //modify the buffer size above to change the size of chunk . . .
              }
       }
}

答案 1 :(得分:1)

您可以使用分页机制,其中您一次读取指定数量的行。使用File.ReadLines方法,因为它只会在您访问行时将行读入内存。这是一些代码:

private static int pageNumber = 0;
const int PageSize = 10;
public static void Main()
{
    IEnumerable<string> page;
    List<string> lines = new List<string>();
    while ((page = NextPage()).Any())
    {
        // Here I am simply throwing the contents into a List 
        // but you can show it in the DataTable
        lines = page.ToList();

        // Do processing
    }

    Console.Read();
}

private static IEnumerable<string> NextPage()
{
    IEnumerable<string> page = File.ReadLines("Path")
        .Skip(pageNumber * PageSize).Take(PageSize);
    pageNumber++;

    return page;
}