【问题标题】:storing large amounts of text in memory在内存中存储大量文本
【发布时间】:2009-12-23 16:00:33
【问题描述】:

如果您需要能够在内存中存储大量纯文本以便对其进行搜索和编辑,您会使用哪种数据类型?

假设我将一个 10000 行的文档加载到我的 C# 应用程序中以使用 LINQ 进行搜索,你将如何在内存中表示它?

不是字符串,因为它是可变的,而字符串是不可变的。

【问题讨论】:

  • 添加了文本、搜索和 linq 标签。希望这将有助于引入对如何完成您想做的事情有更专业知识的人。
  • A List 是相当可变的。

标签: c# linq search text


【解决方案1】:

您始终可以使用 MemoryStream,然后使用 StreamReader 从内存中读取数据。

您可能会从以下链接中获得一些提升,该链接讨论了将 LINQ 与 StreamReader 结合使用。我不确定它是否完全符合您的要求。

http://blogs.msdn.com/ericwhite/archive/2006/08/31/linq-to-text-files.aspx

来自博文:

  StreamReader sr = new StreamReader("TextFile.txt");

  var t1 =
    from line in sr.Lines()
    let items = line.Split(',')
    where ! line.StartsWith("#")
    select String.Format("{0}{1}{2}",
        items[1].PadRight(16),
        items[2].PadRight(16),
        items[3].PadRight(16));

  var t2 =
    from line in t1
    select line.ToUpper();

  foreach (var t in t2)
    Console.WriteLine(t);

  sr.Close();

您希望将 StreamReader 实例更改为类似

StreamReader sr = new StreamReader(myMemoryStreamVar)

或类似的东西。

【讨论】:

  • 可以用LINQ查询内存流中的数据吗?
  • 在将 StreamReader 附加到 MemoryStream 时,可以使用 ReadToEnd() 方法将整个内存流读出为字符串,然后进行搜索。尝试使用内置的 .NET 东西来执行高性能、高负载的字符串操作时会遇到一些问题。最好自己编写搜索例程来搜索内存流。此外,如果您正在从磁盘读取数据,则不必一次将其全部读入内存。流读取器可以从磁盘中读取块中的数据以降低内存使用率。
  • 刚刚添加了一个博客文章的链接,该文章描述了一种扩展方法技术,该技术允许您使用 LINQ 搜索大型文本文件,而无需将整个文件加载到内存中。它使用我建议的 StreamReader 技术,但有一个实际的代码示例,我更新了我的答案以包含。这是使用 LINQ 搜索文本文件的一种非常简洁的方法。强烈推荐。
  • 请原谅我的无知,但是在内存中存储 100mb 的文本文件并在需要时搜索它有什么特别的问题吗?
  • 我知道我可能会因此受到一些批评,但如果要对其进行大量搜索并且它不会改变,那么在内存中存储一​​个 100mb 的字符串可能不是问题。请记住,使用 100mb 内存并不理想,可能会降低应用程序的性能。要考虑的一件事是使用某种数据结构压缩数据,或者直接压缩字符串本身,然后将其解压缩以进行搜索。所有这些选项都有其优点和缺点,因此您必须自己决定哪一个最适合您的需求。
【解决方案2】:

Stringbuilder 适合。在内部,它是一个缓冲区,并且是可变的。

【讨论】:

  • 如果你的搜索做得好,那应该是。关键是在 stringbuilder 的内部 char[] 上进行搜索,因此您不会为了进行搜索而执行大量字符串 alloc/dealloc。这是我认为使用 Brian 提供的流读取器/内存流选项时您会遇到的唯一问题。
【解决方案3】:

尝试使用内存映射文件。它是 .net 4.0 中的新 BCL。

这是链接。 http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile(VS.100).aspx

谢谢

【讨论】:

    【解决方案4】:

    StringBuilder 使用堆进行内存分配,这可能会导致运行时出现内存不足的异常。

    谢谢

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 2014-09-20
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多