我尝试使用以下代码将文件拆分为32GB,但我得到了memory exception
。
请建议我使用C#
分割文件。
string[] splitFile = File.ReadAllLines(@"E:\\JKS\\ImportGenius\\0.txt");
int cycle = 1;
int splitSize = Convert.ToInt32(txtNoOfLines.Text);
var chunk = splitFile.Take(splitSize);
var rem = splitFile.Skip(splitSize);
while (chunk.Take(1).Count() > 0)
{
string filename = "file" + cycle.ToString() + ".txt";
using (StreamWriter sw = new StreamWriter(filename))
{
foreach (string line in chunk)
{
sw.WriteLine(line);
}
}
chunk = rem.Take(splitSize);
rem = rem.Skip(splitSize);
cycle++;
}
答案 0 :(得分:13)
嗯,首先,您需要使用File.ReadLines
(假设您使用的是.NET 4),这样它就不会尝试将整个内容读入内存。然后我只是继续调用一个方法来将“下一行”多行吐出到新文件中:
int splitSize = Convert.ToInt32(txtNoOfLines.Text);
using (var lineIterator = File.ReadLines(...).GetEnumerator())
{
bool stillGoing = true;
for (int chunk = 0; stillGoing; chunk++)
{
stillGoing = WriteChunk(lineIterator, splitSize, chunk);
}
}
...
private static bool WriteChunk(IEnumerator<string> lineIterator,
int splitSize, int chunk)
{
using (var writer = File.CreateText("file " + chunk + ".txt"))
{
for (int i = 0; i < splitSize; i++)
{
if (!lineIterator.MoveNext())
{
return false;
}
writer.WriteLine(lineIterator.Current);
}
}
return true;
}
答案 1 :(得分:6)
不要将立即所有行都读入数组,而是使用StremReader.ReadLine方法,例如:
using (StreamReader sr = new StreamReader(@"E:\\JKS\\ImportGenius\\0.txt"))
{
while (sr.Peek() >= 0)
{
var fileLine = sr.ReadLine();
//do something with line
}
}
答案 2 :(得分:3)
不是使用File.ReadAllLines
一次读取所有文件,而是在foreach循环中使用File.ReadLines
来根据需要读取行。
foreach (var line in File.ReadLines(@"E:\\JKS\\ImportGenius\\0.txt"))
{
// Do something
}
编辑:在不相关的注释中,在为字符串添加“@”前缀时,不必转义反斜杠。因此,要么写"E:\\JKS\\ImportGenius\\0.txt"
,要么@"E:\JKS\ImportGenius\0.txt"
,但@"E:\\JKS\\ImportGenius\\0.txt"
是多余的。
答案 3 :(得分:3)
File.ReadAllLines
这会将整个文件读入内存。
要处理大型文件,您只需要将您现在需要的内容读入内存,然后在完成后立即将其丢弃。
一个更好的选项是File.ReadLines
,它返回一个惰性枚举器,当你从枚举器得到下一行时,数据只被读入内存。如果您避免多次枚举(例如,不使用Count()
),则只会读取文件的某些部分。
答案 4 :(得分:0)
这里的问题是您使用File.ReadAllLines()
一次将整个文件的内容读入内存。你需要做的是打开一个File.OpenRead()
的FileStream并读/写更小的块。
编辑:实际上对于你的情况,ReadLine显然更好。看到其他答案。 :)
答案 5 :(得分:0)
使用StreamReade r读取文件,使用StreamWriter写入。