Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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# 转换列表<;A>;列出<;B>;没有两份副本#_C#_Database_List_Memory_Garbage Collection - Fatal编程技术网

C# 转换列表<;A>;列出<;B>;没有两份副本#

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的细节,无法在插入数据库时进行此转换 你们有什么好办法来做这类操

我有一个C语言的列表(
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如果你不能改变原来的列表,那么你的选择是有限的。如果class
B
可序列化,则可以将转换后的数据序列化为磁盘文件,然后在反序列化转换后的数据之前删除原始列表。这可能会非常慢,但会占用更少的内存。但是,如果您没有耗尽内存,那么为什么您首先需要担心它,即使它暂时使用了大量RAM?这是一个好主意。在这个阶段,我们决定将数据分成不同的子集,并在这些子集上执行批量复制。不过,我们实际上是在摆脱记忆异常。谢谢你的帮助。你好,谢谢你的回答。我想这样做可能是最好的办法。我当时尝试了这个解决方案,但我无法将aList[I]设置为null,因为它是通过API提供的,而API将其设置为只读。还有其他想法吗?@aleksk-Hmm如果你不能改变原来的列表,那么你的选择是有限的。如果class
B
可序列化,则可以将转换后的数据序列化为磁盘文件,然后在反序列化转换后的数据之前删除原始列表。这可能会非常慢,但会占用更少的内存。但是,如果您没有耗尽内存,那么为什么您首先需要担心它,即使它暂时使用了大量RAM?这是一个好主意。在这个阶段,我们决定将数据分成不同的子集,并在这些子集上执行批量复制。不过,我们实际上是在摆脱记忆异常。谢谢你的帮助。如果不知道你为什么需要
列表
,很难说。除此之外,我将迭代
列表
,并
返回将被处理并设置为
null的每个项目。这样,在发送到数据库时,您可以在每个项目上释放ram。@C4ud3x,如果可以的话,我会这样做,但是在数据库中插入条目1乘1花费的时间太长。我正在使用SqlBulkCopy插入数据。啊,我明白了。因此,您需要格式化数据,使其适合将其插入SqlBulkCopy的过程。然后我再也说不出比马修的答案更好的了。如果不知道你为什么需要
列表
,很难说。除此之外,我将迭代
列表
,并
返回将被处理并设置为
null的每个项目。这样,在发送到数据库时,您可以在每个项目上释放ram。@C4ud3x,如果可以的话,我会这样做,但是在数据库中插入条目1乘1花费的时间太长。我正在使用SqlBulkCopy插入数据。啊,我明白了。因此,您需要格式化数据,使其适合将其插入SqlBulkCopy的过程。那么,我说不出比马修在回答中说得更好的了。