0

ユーザーが非常に大きな(GB)ファイルを使用してもプログラムの速度を維持できるように、ファイルをチャンクでロードするために数日間試みてきました。現在、私は次のコードを持っています:

using (FileStream filereader = new FileStream(filename, FileMode.Open, FileAccess.Read))
  {
    using (StreamReader reader = new StreamReader(filereader))
    {
      while (toRead > 0 && (bytesread = reader.Read(buffer, offset, toRead)) > 0)
      {
        toRead -= bytesread;
        offset += bytesread;
      }

      if (toRead > 0) throw new EndOfStreamException();

      foreach (var item in buffer)
      {
        temporary = temporary += item.ToString();
      }
      temporary.Replace("\n", "\n" + System.Environment.NewLine);

以下は、混乱を避けるための宣言です (うまくいけば):

  const int Max_Buffer = 5000;
  char[] buffer = new char[Max_Buffer];
  int bytesread;
  int toRead = 5000;
  int offset = 0;

現時点では、プログラムは 5000 バイトのテキスト ファイルを読み取り、そのバイトを処理して文字列に変換し、それを文字列リーダーに渡して、必要な情報を取得できるようにします。

現時点での問題は、バッファーが行の途中で停止する可能性があるため、stringreader クラスでデータを取得すると、インデックス/長さのエラーが発生することです。

私が必要とするのは、配列をシークして行の開始を示す特定の文字セットを見つけ、そのポイントの前のデータのみを文字列に処理する方法を知ることです。

シークバックの問題をソートした後のもう 1 つの問題は、処理したくないデータを保持し、バッファを埋めるためにさらにデータを取り込む方法です。

これがよく説明されていることを願っています。誰かが助けてくれることを願って時々混乱することがあります。

4

1 に答える 1

0

ループでreader.Read()の代わりにreader.ReadLine( )を使用することをお勧めします

buffer=reader.ReadLine();
bytesread = buffer.Length*2;//Each charcter is unicode and equal to 2 bytes

次に、(toRead - bytesread)<0 かどうかを確認できます。

于 2013-04-16T14:21:37.547 に答える