Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在内存中存储大量文本_C#_Linq_Search_Text - Fatal编程技术网

C# 在内存中存储大量文本

C# 在内存中存储大量文本,c#,linq,search,text,C#,Linq,Search,Text,如果您需要能够在内存中存储大量纯文本,以便对其进行搜索和编辑,您会使用哪种数据类型 假设我将一个10000行的文档加载到我的C#应用程序中,以便使用LINQ进行搜索,您将如何在内存中表示它 不是字符串,因为它是可变的,字符串是不可变的。您可以使用MemoryStream,然后使用StreamReader从内存中读取数据 下面的链接讨论了如何将LINQ与StreamReader结合使用。我不确定它是否完全符合你想要做的 从博客帖子: StreamReader sr = new StreamR

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

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


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

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

下面的链接讨论了如何将LINQ与StreamReader结合使用。我不确定它是否完全符合你想要做的

从博客帖子:

  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)

或者类似的东西。

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

下面的链接讨论了如何将LINQ与StreamReader结合使用。我不确定它是否完全符合你想要做的

从博客帖子:

  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)

或者类似的东西。

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

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

尝试使用内存映射文件。它是.NET4.0中的一个新BCL

这是链接。


谢谢

尝试使用内存映射文件。它是.NET4.0中的一个新BCL

这是链接。


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


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


谢谢

您能用LINQ查询memorystream中的数据吗?当您将StreamReader附加到memorystream时,您可以使用ReadToEnd()方法将整个内存流读取到字符串中,然后进行搜索。在尝试使用内置的.NET来执行高性能、高负载的字符串操作时,会遇到一些问题。最好自己编写搜索例程来搜索内存流。此外,如果您正在从磁盘读取数据,则不必一次将其全部读入内存。流读取器可以从磁盘读取数据块中的数据,以降低内存使用率。刚刚在一篇博客文章中添加了一个链接,介绍了一种扩展方法技术,允许您使用LINQ搜索大型文本文件,而无需将整个文件加载到内存中。它使用了我建议的StreamReader技术,但有一个实际的代码示例,我更新了答案以包含它。使用LINQ搜索文本文件是一种非常简洁的方法。强烈推荐。请原谅我的无知,但是在内存中存储100mb的文本文件并随时搜索它是否有任何特别的问题?我知道我可能会为此受到一些批评,但如果它将被大量搜索并且不会改变,那么在内存中存储100mb的字符串可能不是问题。请记住,使用100mb内存并不理想,可能会降低应用程序的性能。需要考虑的是使用某种数据结构压缩数据,或者逐字压缩字符串本身,然后将其解压缩到搜索。所有这些选项都有其优缺点,因此您必须自己决定哪一个最适合您的需要。您可以使用LINQ查询memorystream中的数据吗?当您将StreamReader附加到memorystream时,您可以使用ReadToEnd()方法将整个内存流读取到字符串,然后进行搜索。在尝试使用内置的.NET来执行高性能、高负载的字符串操作时,会遇到一些问题。最好自己编写搜索例程来搜索内存流。此外,如果您正在从磁盘读取数据,则不必一次将其全部读入内存。流读取器可以从磁盘读取数据块中的数据,以降低内存使用率。刚刚在一篇博客文章中添加了一个链接,介绍了一种扩展方法技术,允许您使用LINQ搜索大型文本文件,而无需将整个文件加载到内存中。它使用了我建议的StreamReader技术,但有一个实际的代码示例,我更新了答案以包含它。使用LINQ搜索文本文件是一种非常简洁的方法。强烈推荐。请原谅我的无知,但是在内存中存储100mb的文本文件并随时搜索它是否有任何特别的问题?我知道我可能会为此受到一些批评,但如果它将被大量搜索并且不会改变,那么在内存中存储100mb的字符串可能不是问题。请记住,使用100mb内存并不理想,可能会降低应用程序的性能。需要考虑的是使用某种数据结构压缩数据,或者逐字压缩字符串本身,然后将其解压缩到搜索。所有这些选项都有其优缺点,所以你必须自己决定哪一个最适合你的需要。添加文本、搜索和linq标签。希望这将有助于带来一个更专业的人,了解如何完成你想要做的事情。列表是非常可变的。添加了文本、搜索和linq标记。希望这将有助于引进一个更专业的人,了解如何完成你想要做的事情。列表是非常可变的。如果你搜索得好,它应该是。关键是在stringbuilder的内部字符[]上进行搜索,这样您就不会仅仅为了进行搜索而进行大量的字符串alloc/dealloc。这是唯一的问题,我想你会有一个由Brian提供的streamreader/memory stream选项。如果你的搜索做得好,它应该是。关键是搜索stringbuilder的内部字符[],所以