以下のコードを試しています。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はデバッガの値を表示しますが、
いくつかのアレイを試してみましたが、読み書きするときにアイテムを削除しようとしましたか? – lcssanches
これは、イテレータを使用して、メモリ内のファイル全体をプルしようとしない行単位で読む方法です:http://stackoverflow.com/questions/1271225/c-sharp-reading-a-file-line-by -line – neontapir
行の長さによっては、このメソッドで大きなオブジェクトヒープフラグメンテーションの問題が発生する可能性があります。 – Earlz