我们正在尝试使用以下代码。
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;
}
}
它创建了大约36个文本文件(大约800 MB),但是在lineIterator.MoveNext()创建第37个文件时开始抛出“Out of memory exception”。
lineIterator.Current显示调试器中的值。
答案 0 :(得分:0)
因为它是一个巨大的文件,所以你应该阅读BinaryReader的Seek
和ReadBytes
方法。
您可以看到一个简单的示例here。使用ReadBytes检查最后一行后,将进程文件写入您读取的一定数量的行中。不要写你读的每一行,也不要把所有数据保存在内存中。
剩下的就在你手中。
可能是因为那个When does File.ReadLines free resources
IEnumerable
不会从IDisposable继承,因为通常,实现它的类只会给你可枚举的承诺,它实际上没有做任何可以处理的事情。