在不浪费内存的情况下读取文本文件
Reading a text file without waste of memory
我用 get 创建了一个名为 line
的字符串变量;并设置;在夏普。
之后我使用这个变量在 while 循环中读取文本文件,如下所示。
using(StreamReader Reader = new StreamReader(pathtofile))
{
while((line = Reader.ReadLine()) != null)
{
//things to do with the line using regex expressions.
}
}
我知道 csharp 中的字符串是不可变的。所以我怀疑每次读取该行时,都会创建一个新字符串,从而导致一个占用大量内存的唯一行变量。怎么解决?我希望只创建一次变量,并且在内存中没有多个行变量的情况下为每一行使用相同的变量。我不知道如何解决这个问题。有人会尝试解释真实情况吗?提前致谢。
如果您使用 get;
和 set;
,那么您声明的是 属性,而不是字段(即变量)。坦率地说,您可能应该在循环内将 local 变量声明为 string line;
,但如果没有 a good, minimal, complete code example.
就无法确定
就手头的问题而言,不:将新值重新分配给变量不会创建新变量。变量的生命周期取决于它的声明方式,而不是你给它赋值的频率。
当您通读文件时,将为每一行的变量分配一个新值(即 string
引用)。这将覆盖旧值。假设没有其他变量保留对旧值的引用,那么该值引用的 string
对象最终将被垃圾收集器丢弃。
它可能会也可能不会立即被丢弃。一般来说,GC的运行对你自己的代码是透明的。它在幕后工作以确保您的程序不会消耗比它需要的更多的内存,同时还确保不会花费太多时间来尝试将内存消耗保持在最低限度(即通过允许 "garbage" 累加在某种程度上,而不是总是试图立即释放所有东西,它使用更少的 CPU 时间管理内存)。
也就是说,不……您发布的代码不会浪费内存。实际上,这是实现逐行读取文本文件 具体 而不浪费内存的惯用方法。与例如File.ReadAllLines()
或 TextReader.ReadToEnd()
,它们试图将整个文件内容一次性存储在内存中。
我用 get 创建了一个名为 line
的字符串变量;并设置;在夏普。
之后我使用这个变量在 while 循环中读取文本文件,如下所示。
using(StreamReader Reader = new StreamReader(pathtofile))
{
while((line = Reader.ReadLine()) != null)
{
//things to do with the line using regex expressions.
}
}
我知道 csharp 中的字符串是不可变的。所以我怀疑每次读取该行时,都会创建一个新字符串,从而导致一个占用大量内存的唯一行变量。怎么解决?我希望只创建一次变量,并且在内存中没有多个行变量的情况下为每一行使用相同的变量。我不知道如何解决这个问题。有人会尝试解释真实情况吗?提前致谢。
如果您使用 get;
和 set;
,那么您声明的是 属性,而不是字段(即变量)。坦率地说,您可能应该在循环内将 local 变量声明为 string line;
,但如果没有 a good, minimal, complete code example.
就手头的问题而言,不:将新值重新分配给变量不会创建新变量。变量的生命周期取决于它的声明方式,而不是你给它赋值的频率。
当您通读文件时,将为每一行的变量分配一个新值(即 string
引用)。这将覆盖旧值。假设没有其他变量保留对旧值的引用,那么该值引用的 string
对象最终将被垃圾收集器丢弃。
它可能会也可能不会立即被丢弃。一般来说,GC的运行对你自己的代码是透明的。它在幕后工作以确保您的程序不会消耗比它需要的更多的内存,同时还确保不会花费太多时间来尝试将内存消耗保持在最低限度(即通过允许 "garbage" 累加在某种程度上,而不是总是试图立即释放所有东西,它使用更少的 CPU 时间管理内存)。
也就是说,不……您发布的代码不会浪费内存。实际上,这是实现逐行读取文本文件 具体 而不浪费内存的惯用方法。与例如File.ReadAllLines()
或 TextReader.ReadToEnd()
,它们试图将整个文件内容一次性存储在内存中。