使用大文件将文本从一个文件附加到另一个文件的最快方法是什么
What's the fastest way of appending text from one file to another with huge files
所以我有 5 个文本文件,每个文本文件大小为 50GB,我想将它们全部合并到 1 个文本文件中,然后调用 LINQ 语句 .Distinct()
,以便新文件中只有唯一的条目。
我现在的做法是这样的
foreach (var file in files)
{
if (Path.GetExtension(file) == ".txt")
{
var lines = File.ReadAllLines(file);
var b = lines.Distinct();
File.AppendAllLines(clear, lines);
}
}
这里出现的问题是应用程序现在将整个文本文件加载到内存中,使我的 RAM 使用率达到 100%。如果我有 64GB 的 ram 但我只有 16GB,这个解决方案可能会奏效。实现我想要完成的目标的最佳选择是什么?我应该在 CPU 上使用内核吗? 运行 5900x。
如果保持顺序不重要,并且可能的字符有限(例如 A-Z),可能会说,“好的,让我们从 As 开始”。
所以你从每个文件开始,逐行检查,直到找到以 'A' 开头的行。如果找到一个,将它添加到一个新文件和一个 HashSet 中。每次找到以 'A' 开头的新行时,检查它是否在 HashSet 中,如果不在,则将其添加到新文件和 HashSet 中。处理完所有文件后,处理 HashSet 并跳到下一个字母 (B)。
您将以这种方式遍历文件 26 次。
当然你可以进一步优化它。检查有多少内存可用并将可能的字符按范围划分,例如,在第一次迭代中,您的 HashSet 可能包含以 A-D.
开头的任何内容
所以我有 5 个文本文件,每个文本文件大小为 50GB,我想将它们全部合并到 1 个文本文件中,然后调用 LINQ 语句 .Distinct()
,以便新文件中只有唯一的条目。
我现在的做法是这样的
foreach (var file in files)
{
if (Path.GetExtension(file) == ".txt")
{
var lines = File.ReadAllLines(file);
var b = lines.Distinct();
File.AppendAllLines(clear, lines);
}
}
这里出现的问题是应用程序现在将整个文本文件加载到内存中,使我的 RAM 使用率达到 100%。如果我有 64GB 的 ram 但我只有 16GB,这个解决方案可能会奏效。实现我想要完成的目标的最佳选择是什么?我应该在 CPU 上使用内核吗? 运行 5900x。
如果保持顺序不重要,并且可能的字符有限(例如 A-Z),可能会说,“好的,让我们从 As 开始”。
所以你从每个文件开始,逐行检查,直到找到以 'A' 开头的行。如果找到一个,将它添加到一个新文件和一个 HashSet 中。每次找到以 'A' 开头的新行时,检查它是否在 HashSet 中,如果不在,则将其添加到新文件和 HashSet 中。处理完所有文件后,处理 HashSet 并跳到下一个字母 (B)。
您将以这种方式遍历文件 26 次。
当然你可以进一步优化它。检查有多少内存可用并将可能的字符按范围划分,例如,在第一次迭代中,您的 HashSet 可能包含以 A-D.
开头的任何内容