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