【问题标题】:Reading many files causes memory issues?读取很多文件会导致内存问题?
【发布时间】:2017-03-23 05:19:52
【问题描述】:

我正在搜索系统上的许多文件,以在其中查找我正在编写的计算机搜索程序的文本。但是,当读取较大的文件时,这些行会保留在内存中,使其使用超过 GB 的内存。我想知道问题是什么。这是我的代码。

    private int SearchInFile(SearchResult searchResult, Options options) {
        if (searchQuery.inFile.Length == 0) return -1;
        if (!options.searchOnlyInTextFiles || searchResult.type.Equals(".txt")) {
            try {
                int index = 0;
                foreach(string line in File.ReadLines(searchResult.path)) {
                    index++;
                    if (line.Contains(searchQuery.inFile)) return index;
                }
            } catch(Exception e) {
                Console.WriteLine(e);
            }
        }
        return -1;
    }

【问题讨论】:

  • 你有什么问题?
  • 在托管内存中,内存使用量增长是正常的。一旦有内存压力,GC 就会清理。
  • @Sefe 但千兆字节?
  • @DavidHeffernan 我想知道为什么在 for 循环中使用了这么多内存
  • 嗯,你读了很多文件,如果没有理由让 GC 收集内存,如果不收集,效率会更高。您的程序是否表现不佳?

标签: c# file memory memory-management foreach


【解决方案1】:

您应该打开一个流,例如 FileStream,并且一次只能读取 1024 个字节。您应该检查字节,并仅在 RAM 中建立当前行,直到找到一个新行字符,然后在该行中查找您要查找的文本。这样,您只需将当前正在检查的行保留在 RAM 中。

您需要注意如何定义行尾。不同的文本文件有不同的方式来定义行的结束位置。除此之外,您还需要了解 .txt 文件的编码方式、UTF8、ASCII 等。

如果你小心,你可以确保你的应用程序永远不会使用超过一定数量的 RAM,并且垃圾收集器不那么忙。

【讨论】:

  • 非常感谢!这完全解决了我的问题。
  • o 是的 xd,去吧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2013-09-22
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多