我将数据存储在几个单独的文本文件中,然后进行分析和分析。

处理的数据大小差异很大。它的范围从几百兆字节(或更少)到十多个千兆字节。

我首先将解析的数据存储在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/

10-12 21:58
查看更多