0

私はC#の初心者ですが、大きなtxtファイルの読み取り/書き込みについていくつかの調査を行いました。最大は8GBかもしれませんが、大きすぎる場合は1GBに分割することを検討します。最大 30MBytes/s の速度が必要です。シーケンシャル操作の FileStream または StreamReader/StreamWriter、ランダム アクセスの MemoryMappedFiles の 3 つのアプローチを見つけました。今、私は最初にファイルを読みたいと思います。動作するコードの例を次に示します。

 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 バイトが読み取られた場合に、その文字列チャンクを送信することだと思います。

4

1 に答える 1

3

私はこのようなものを見つけました:

            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); この部分だけが本当に高速になることを願ってい ます。誰かが提案したいことがあれば、躊躇しないでください。

于 2012-10-24T09:57:56.190 に答える