2013-06-03 9 views
5

以下のコードを試しています。ASP.net C#:File.ReadLines(fileName).GetEnumerator()を使用して行ごとに20〜200 GBのファイルを読み込む方法

public static int SplitFile(string fileName, string tmpFolder, List<string> queue, int splitSize = 100000) 
    { 
     int chunk = 0; 
     if (!Directory.Exists(tmpFolder)) 
      Directory.CreateDirectory(tmpFolder); 
     using (var lineIterator = File.ReadLines(fileName).GetEnumerator()) 
     { 
      bool stillGoing = true; 
      for (chunk = 0; stillGoing; chunk++) 
      { 
       stillGoing = WriteChunk(lineIterator, splitSize, chunk, tmpFolder, queue); 
      } 
     } 
     return chunk; 
    } 

    private static bool WriteChunk(IEnumerator<string> lineIterator, 
            int splitSize, int chunk, string tmpFolder, List<string> queue) 
    { 
     try 
     { 

      //int tmpChunkSize = 1000; 
      //int tmpChunkInc = 0; 
      string splitFile = Path.Combine(tmpFolder, "file" + chunk + ".txt"); 

      using (var writer = File.CreateText(splitFile)) 
      { 
       queue.Add(splitFile); 
       for (int i = 0; i < splitSize; i++) 
       { 
        if (!lineIterator.MoveNext()) 
        { 
         return false; 
        } 
        writer.WriteLine(lineIterator.Current); 

       } 
      } 

      return true; 
     } 
     catch (Exception) 
     { 

      throw; 
     } 

    } 

それは)((800メガバイトの周り)の周りに36のテキストファイルを作成しますが、lineIterator.MoveNextで第37回ファイルの作成時に「メモリ不足の例外のうち」投げ始めます。

lineIterator.Currentはデバッガの値を表示しますが、

+0

いくつかのアレイを試してみましたが、読み書きするときにアイテムを削除しようとしましたか? – lcssanches

+0

これは、イテレータを使用して、メモリ内のファイル全体をプルしようとしない行単位で読む方法です:http://stackoverflow.com/questions/1271225/c-sharp-reading-a-file-line-by -line – neontapir

+2

行の長さによっては、このメソッドで大きなオブジェクトヒープフラグメンテーションの問題が発生する可能性があります。 – Earlz

答えて

0

巨大なファイルなので、BinaryReaderのSeekReadBytesの方法をお読みください。

単純な例hereが表示されます。最後の改行をReadBytesチェックで確認し、読み込んだ行の中にプロセスファイルを書き込んでください。あなたが読んだすべての行を書き留めたり、すべてのデータをメモリに残したりしないでください。

残りはあなたの手元にあります。たぶん、一般的に、それだけであなたの可算であることの約束を与え実装するクラスは、それが実際にはまだ何もしていませんので、IDisposableを継承しない1 When does File.ReadLines free resources

IEnumerableにrealtedさ

それは廃棄を保証する。

+4

[File.ReadLines](http://msdn.microsoft.com/en-us/library/dd383503.aspx)の全体的なポイントは、ファイル全体をメモリに読み込まないことです。ここに間違っていることがあります。 –

+0

あなたの引用に基づいて、その最初の段落の後に答えを読み終えたようです。私はあなたが読むことをお勧めします。また、ファイルハンドルが解放されたときに、テキスト行がメモリに保存される時間とは異なります。テキスト行を読み込んだ後、そのメモリを解放してからファイルハンドルを解放することができます。 – Servy

関連する問題