我将数据存储在几个单独的文本文件中,然后进行分析和分析。
处理的数据大小差异很大。它的范围从几百兆字节(或更少)到十多个千兆字节。
我首先将解析的数据存储在List<DataItem>
中,因为我想在分析过程中执行BinarySearch()
。但是,如果解析了太多数据,程序将引发OutOfMemory-Exception。解析器可以处理的确切数量取决于内存的碎片。有时它只是文件的1.5 GB,而其他时候是3 GB。
目前,我使用的List<List<DataItem>>
条目数量有限,因为我认为它会改变所有内容。但是没有任何重大改进。
我尝试的另一种方法是序列化解析器数据,然后在需要时反序列化它。这种方法的结果甚至更糟。整个过程花费了更长的时间。
我查看了内存映射文件,但我真的不知道它们是否可以帮助我,因为我以前从未使用过它们。他们会吗?
那么,如何才能快速访问所有文件中的数据而又不会抛出OutOfMemoryException
并根据其属性查找DataItem
的危险?
编辑:解析器大致是这样的:
void Parse() {
LoadFile();
for (int currentLine = 1; currentLine < MAX_NUMBER_OF_LINES; ++currentLine) {
string line = GetLineOfFile(currentLine);
string[] tokens = SplitLineIntoTokens(line);
DataItem data = PutTokensIntoDataItem(tokens);
try {
List<DataItem>.Add(data);
} catch (OutOfMemoryException ex) {}
}
}
void LoadFile(){
DirectoryInfo di = new DirectroyInfo(Path);
FileInfo[] fileList = di.GetFiles();
foreach(FileInfo fi in fileList)
{
//...
StreamReader file = new SreamReader(fi.FullName);
//...
while(!file.EndOfStram)
strHelp = file.ReadLine();
//...
}
}
最佳答案
我相信没有正确的答案。实施取决于许多因素,只有您可以对它进行优缺点评估。
如果您的主要目的是解析大文件和大量文件,则出于各种原因(例如出于各种原因),将这些文件保留在内存中而不考虑可用的RAM数应该是第二选择。例如发生未处理的异常时的持久性。
尽管在初始条件下进行性能分析时,您可能会受到鼓励并倾向于将它们加载到内存中以进行操作和搜索,但是随着文件数量的增加,这种情况很快就会改变,并且您的应用程序支持者将立即放弃使用此功能。
我会做以下
读取每个文件内容并将其存储到文档数据库(例如Raven DB),例如
在这些文档上执行解析例程,并将相关关系存储在rdbms db中(如果需要)
在文档数据库(原始)或关系数据库(您的解析输出)上随意搜索全文本或其他内容
这样,您就可以利用这些系统的创建者所做的研究来有效地管理内存,并专注于性能。
我意识到这可能不是您的答案,但是对于可能认为这更好并且适合的人。
关于c# - 如何在C#中处理大量数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31405949/