C# 转换列表<;A>;列出<;B>;没有两份副本#
我有一个C语言的列表(C# 转换列表<;A>;列出<;B>;没有两份副本#,c#,database,list,memory,garbage-collection,C#,Database,List,Memory,Garbage Collection,我有一个C语言的列表(list),大小一直在900MB左右。 将此列表转换为另一种类型(list,用于插入数据库)时,我迭代每个元素以将其添加到新列表中 这需要使用大量的RAM,所以我想知道是否有一种方法可以在不使用任何额外RAM的情况下将该列表转换为新类型 在这个阶段,我考虑迭代列表,将其转换为列表,批量处理100000个元素,将列表元素设置为null,并强制执行垃圾收集可能是一种方法 由于数据库IO性能问题,以及如何实现List的细节,无法在插入数据库时进行此转换 你们有什么好办法来做这类操
list
),大小一直在900MB左右。
将此列表转换为另一种类型(list
,用于插入数据库)时,我迭代每个元素以将其添加到新列表中
这需要使用大量的RAM,所以我想知道是否有一种方法可以在不使用任何额外RAM的情况下将该列表转换为新类型
在这个阶段,我考虑迭代列表
,将其转换为列表
,批量处理100000个元素,将列表
元素设置为null,并强制执行垃圾收集可能是一种方法
由于数据库IO性能问题,以及如何实现List
的细节,无法在插入数据库时进行此转换
你们有什么好办法来做这类操作吗?假设
a
和B
是类,并且你们有一个公共静态B转换(a a)
方法来将a
转换成B
,我会这样做:
List<A> aList = new List<A>(); // Assume this list is populated.
var bList = new List<B>(aList.Count);
for (int i = 0; i < aList.Count; ++i)
{
bList.Add(Transform(aList[i]));
aList[i] = null;
}
// If aList is a local it will go out of scope and its remaining
// memory will be freed. If it is not local, you must ensure that
// all remaining references to it (if any) are set to null.
List aList=new List();//假设此列表已填充。
var bList=新列表(列表计数);
for(int i=0;i
假设A
和B
是类,并且您有一个公共静态B转换(A A)
方法将A
转换为B
,我会这样做:
List<A> aList = new List<A>(); // Assume this list is populated.
var bList = new List<B>(aList.Count);
for (int i = 0; i < aList.Count; ++i)
{
bList.Add(Transform(aList[i]));
aList[i] = null;
}
// If aList is a local it will go out of scope and its remaining
// memory will be freed. If it is not local, you must ensure that
// all remaining references to it (if any) are set to null.
List aList=new List();//假设此列表已填充。
var bList=新列表(列表计数);
for(int i=0;i
您好,谢谢您的回答。我想这样做可能是最好的办法。我当时尝试了这个解决方案,但我无法将aList[I]设置为null,因为它是通过API提供的,而API将其设置为只读。还有其他想法吗?@aleksk-Hmm如果你不能改变原来的列表,那么你的选择是有限的。如果classB
可序列化,则可以将转换后的数据序列化为磁盘文件,然后在反序列化转换后的数据之前删除原始列表。这可能会非常慢,但会占用更少的内存。但是,如果您没有耗尽内存,那么为什么您首先需要担心它,即使它暂时使用了大量RAM?这是一个好主意。在这个阶段,我们决定将数据分成不同的子集,并在这些子集上执行批量复制。不过,我们实际上是在摆脱记忆异常。谢谢你的帮助。你好,谢谢你的回答。我想这样做可能是最好的办法。我当时尝试了这个解决方案,但我无法将aList[I]设置为null,因为它是通过API提供的,而API将其设置为只读。还有其他想法吗?@aleksk-Hmm如果你不能改变原来的列表,那么你的选择是有限的。如果classB
可序列化,则可以将转换后的数据序列化为磁盘文件,然后在反序列化转换后的数据之前删除原始列表。这可能会非常慢,但会占用更少的内存。但是,如果您没有耗尽内存,那么为什么您首先需要担心它,即使它暂时使用了大量RAM?这是一个好主意。在这个阶段,我们决定将数据分成不同的子集,并在这些子集上执行批量复制。不过,我们实际上是在摆脱记忆异常。谢谢你的帮助。如果不知道你为什么需要列表
,很难说。除此之外,我将迭代列表
,并返回将被处理并设置为null的每个项目。这样,在发送到数据库时,您可以在每个项目上释放ram。@C4ud3x,如果可以的话,我会这样做,但是在数据库中插入条目1乘1花费的时间太长。我正在使用SqlBulkCopy插入数据。啊,我明白了。因此,您需要格式化数据,使其适合将其插入SqlBulkCopy的过程。然后我再也说不出比马修的答案更好的了。如果不知道你为什么需要列表
,很难说。除此之外,我将迭代列表
,并返回将被处理并设置为null的每个项目。这样,在发送到数据库时,您可以在每个项目上释放ram。@C4ud3x,如果可以的话,我会这样做,但是在数据库中插入条目1乘1花费的时间太长。我正在使用SqlBulkCopy插入数据。啊,我明白了。因此,您需要格式化数据,使其适合将其插入SqlBulkCopy的过程。那么,我说不出比马修在回答中说得更好的了。