【问题标题】:Read large txt file and use it in chunks读取大的txt文件并分块使用
【发布时间】:2012-10-13 20:06:19
【问题描述】:

我是 C# 的新手,但我对读取/写入大型 txt 文件进行了一些研究,最大的可能是 8GB,但如果太多,我会考虑将其拆分为 1GB。它必须快到 30MBytes/s。我找到了三种方法:用于顺序操作 FileStream 或 StreamReader/StreamWriter,用于随机访问 MemoryMappedFiles。 现在我想先阅读文件。这是一个有效的代码示例:

 FileStream fileStream = new FileStream(@"C:\Users\Guest4\Desktop\data.txt", FileMode.Open, FileAccess.Read);
try
{
    int length = (int)fileStream.Length;  // get file length
    buffer = new byte[length];            // create buffer
    int count;                            // actual number of bytes read
    sum = 0;                          // total number of bytes read

    // read until Read method returns 0 (end of the stream has been reached)
    while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
        sum += count;  // sum is a buffer offset for next reading
}
finally
{
    fileStream.Close();
}

你认为快速读取大文件的好方法吗?

阅读后我需要重新发送该文件。它必须是 16384 字节的块。每个块都将被发送,直到所有数据都被传输。并且这些块必须是字符串类型。你能建议我怎么做吗?拆分并转换为字符串。我想最好的方法是在读取所有文件之后发送该字符串块,但如果至少读取了 16384 个字节。

【问题讨论】:

  • 先试试foreach (var line in File.ReadLines("data.txt")) { .... }如果不满意可以试试其他方法
  • 1GB 块太大。这可能会帮助你。 stackoverflow.com/questions/8879301/…
  • 1.如果它足够快,那个'foreach'循环似乎没问题。但我有错误:“System.IO.File”不包含“ReadLine”的定义。我使用 VS2010 和 .NET 4.5。但是如何准确地取 16384 字节呢?每条线都应该有那个大小?我可以像这样使用 StreamReader:'while ((line = sr.ReadLine()) != null)' 而不是 'File.ReadLines' 但对我来说最大的问题是拆分? 2. 我可能会被误解。不是 1GB 块。我的意思是,如果我有 4GB 的数据,我可以将它保存在四个 1GB 的文件中并使用第一个,当第一个完成后,使用第二个......
  • IO.File 不包含 ReadLine 的定义。 StreamReader 包含 ReadLine()。您需要创建一个阅读器并将您的文件附加到它。

标签: c# file-io


【解决方案1】:

我发现了这样的东西:

            FileStream FS = new FileStream(@"C:\Users\Guest4\Desktop\data.txt", FileMode.Open, FileAccess.ReadWrite);
            int FSBytes = (int) FS.Length;
            int ChunkSize = 1<<14;    // it's 16384
            byte[] B = new byte[ChunkSize];
            int Pos;

            for (Pos = 0; Pos < (FSBytes - ChunkSize); Pos += ChunkSize)
            {
                FS.Read(B,0 , ChunkSize);
                // do some operation on one chunk

            }

            B = new byte[FSBytes - Pos];
            FS.Read(B,0, FSBytes - Pos);
            // here the last operation procedure on the last chunk
            FS.Close(); FS.Dispose();

它似乎工作。我希望只有这部分: FS.Read(B,0 , ChunkSize); 会非常快。如果有人有什么建议,请不要犹豫。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2020-10-07
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多