如何通过使用 MigraDoc 添加大量行来避免高 ram 使用率?
How to avoid high ram usage by adding plenty of rows with MigraDoc?
我目前正在从事一个项目,该项目读取一个大文件或多个文件,其中包含 > 数百万行。为此,我使用 Streamreader 来阅读每一行。
检查每一行是否包含特定字符串。当条件为真时,我将添加一行。我必须从内存中重现代码,因为我面前没有代码:
Table table = new Table();
Row row = new Row();
Cell cell = new Cell();
using(Streamreader sr = new Streamreader(file))
{
string str;
while((str = sr.ReadLine()) != null)
{
if(str.Includes("Marker"))
{
row = table.AddRow();
cell = row.Cells[0]
cell = row.Cells[1] // actually I use a counter variable, cause my table has 6 cells consistent.
}
}
}
所以每次条件为真时,都会添加一个行对象,如果有数百万行,也会有数百万个对象,这会影响我的 ram 内存,很可能会 "explode"。我尝试了几件事,例如创建一个包含行对象的列表,并在一定数量后清除它们。但我必须弄清楚它不会从 ram (list.Clear) 中清除对象。我尝试手动调用垃圾收集器,但这对我的性能有负面影响。现在我正处于不知道如何处理的地步。有 50 万行它达到近 7gb 的 ram,我有 8gb 可用。
如果有任何关于如何避免高 ram 或至少保持 ram 低的建议,我将不胜感激。
我还想补充一点,我是 Whosebug 的新手,如果有任何不清楚的地方,请随时指出或指出我:P
您通过逐行读取流中的输入文件来做正确的事情。这意味着只有每个输入文件的当前行需要出现在您的 RAM 中。
但是,您为匹配标记的每一行在 Table 对象中放入一行是错误的。那些 Table 对象存在于 RAM 中。正如您所发现的,尝试创建具有数百万行对象的 Table 个对象将耗尽您的 RAM。
dotnet 集合 类 在支持大量集合方面做得很好。但是使用 RAM 并没有什么神奇之处。
您需要找出一种方法来限制 Table 对象中 Row 对象的数量。你能跟踪行数,当它达到一定数量时(谁知道有多大?10K?100K?)将 table 写入磁盘并创建一个新的?
此外,Migradoc 似乎生成 PDF 文件。百万页的pdf文件是有用的对象吗?这似乎不太可能。 RTF 文件也一样。
我目前正在从事一个项目,该项目读取一个大文件或多个文件,其中包含 > 数百万行。为此,我使用 Streamreader 来阅读每一行。 检查每一行是否包含特定字符串。当条件为真时,我将添加一行。我必须从内存中重现代码,因为我面前没有代码:
Table table = new Table();
Row row = new Row();
Cell cell = new Cell();
using(Streamreader sr = new Streamreader(file))
{
string str;
while((str = sr.ReadLine()) != null)
{
if(str.Includes("Marker"))
{
row = table.AddRow();
cell = row.Cells[0]
cell = row.Cells[1] // actually I use a counter variable, cause my table has 6 cells consistent.
}
}
}
所以每次条件为真时,都会添加一个行对象,如果有数百万行,也会有数百万个对象,这会影响我的 ram 内存,很可能会 "explode"。我尝试了几件事,例如创建一个包含行对象的列表,并在一定数量后清除它们。但我必须弄清楚它不会从 ram (list.Clear) 中清除对象。我尝试手动调用垃圾收集器,但这对我的性能有负面影响。现在我正处于不知道如何处理的地步。有 50 万行它达到近 7gb 的 ram,我有 8gb 可用。
如果有任何关于如何避免高 ram 或至少保持 ram 低的建议,我将不胜感激。
我还想补充一点,我是 Whosebug 的新手,如果有任何不清楚的地方,请随时指出或指出我:P
您通过逐行读取流中的输入文件来做正确的事情。这意味着只有每个输入文件的当前行需要出现在您的 RAM 中。
但是,您为匹配标记的每一行在 Table 对象中放入一行是错误的。那些 Table 对象存在于 RAM 中。正如您所发现的,尝试创建具有数百万行对象的 Table 个对象将耗尽您的 RAM。
dotnet 集合 类 在支持大量集合方面做得很好。但是使用 RAM 并没有什么神奇之处。
您需要找出一种方法来限制 Table 对象中 Row 对象的数量。你能跟踪行数,当它达到一定数量时(谁知道有多大?10K?100K?)将 table 写入磁盘并创建一个新的?
此外,Migradoc 似乎生成 PDF 文件。百万页的pdf文件是有用的对象吗?这似乎不太可能。 RTF 文件也一样。