C# 内存优化列表<;int[]>;

C# 内存优化列表<;int[]>;,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我已经创建了一个服务,它读取多个数据库并将其加载到另一个数据库中 内存使用量是巨大的,所以现在我想减少内存使用量 我有一段代码,我从两个不同的表中读取两个列,并将其写入一个列表 我的问题是,有没有一种更有效的记忆方法来做到这一点 目前列表中大约有340万行,这个数字从现在开始只会增加,因为从中获取的数据库只会变得更大 我所说的代码是这样初始化的,并在foreach循环中使用: private List<int[]> DataIDList_1; private List

我已经创建了一个服务,它读取多个数据库并将其加载到另一个数据库中

内存使用量是巨大的,所以现在我想减少内存使用量

我有一段代码,我从两个不同的表中读取两个列,并将其写入一个列表 我的问题是,有没有一种更有效的记忆方法来做到这一点

目前列表中大约有340万行,这个数字从现在开始只会增加,因为从中获取的数据库只会变得更大

我所说的代码是这样初始化的,并在foreach循环中使用:

    private List<int[]> DataIDList_1;
    private List<int[]> DataIDList_2;
    private List<int[]> DataIDList_3;
    public DatabaseTransferService()
    {
        DataIDList_1= new List<int[]>();
        DataIDList_2= new List<int[]>();
        DataIDList_3= new List<int[]>();
    }
    public void injectValues(docID,statID )
    {
          DataIDList_1.Add(new int[] { docID, statID });
    }
    public void insertData(List<int[]> DataIDList)
    {
        foreach (int[] intArrData in DataIDList)
        {
         int DataID = intArrData[0];
//Inserting data in to database based on the list
        }
    }
私有列表DataIDList_1;
私有列表数据列表2;
私有列表数据列表3;
公共数据库传输服务()
{
DataIDList_1=新列表();
DataIDList_2=新列表();
DataIDList_3=新列表();
}
公共值(docID、statID)
{
DataIDList_1.Add(新int[]{docID,statID});
}
公共void insertData(列表DataIDList)
{
foreach(DataIDList中的int[]intArrData)
{
int DataID=intArrData[0];
//根据列表将数据插入数据库
}
}
我已经删除了对我的问题不重要的代码。 为了澄清,该列表只包含行上的ID,然后我使用这些ID获取行并将数据从一个db插入到另一个db

编辑:我省略了数据库的插入部分,因为它不是我现在看到的部分。我知道可能也有一些东西可以做到这一点,但我目前正在寻找一个最大的平均内存用户,在本例中,这是我从3个数据库中列出的


Edit2:我的想法是加载5个数据库的所有ID,然后将它们加载到统计数据库中,同时根据列表中的ID只获取一行,这意味着我记忆中唯一的东西是我当前正在处理的内容和所有行的ID 为了澄清5个数据库中的任何一行是否有变化,我将根据一个修改表来更新统计数据库,我也加载了ID


提前感谢。

这是两个数据库之间的接口吗?也许你可以让我们在这里获得
yield

public IEnumerable<MyRecord> GetFromOriginalDB()
{
  // some fetching magic
  yield return myRecord;
}

public void WriteToTargetDB(IEnumerable<MyRecord> records)
{
  foreach(var record in records)
  {
    // insert magic
  }
}
public IEnumerable GetFromOriginalDB()
{
//一些迷人的魔法
收益率记录;
}
公共无效WriteToTargetDB(IEnumerable记录)
{
foreach(记录中的var记录)
{
//插入魔法
}
}

这些记录不应保存在内存中(当前记录除外)。然而,这确实需要很多重构,因为它可以工作…

您考虑过将逻辑移到数据库中吗?您可以在SQL Server中执行功能强大且高效的查询。例如,如果另一个表中存在某些值,则可以编写一个查询,其中只在一个表中插入行。您是否分析了代码以查找占用内存最多的内容?我不认为这段代码是造成你大量内存使用的原因。我同意Mark的观点,数据库到数据库是前进的方向。SQL Server有很多工具可以帮助进行数据库复制。为什么不将数据“插入”到内存列表中?虽然我已经给出了答案,但我完全同意数据导入/导出应该在SQL中完成,而不是按照他的要求,但使用IEnumerables的想法是他可以根据自己的需要开发的。该程序旨在读取大约5个数据库(3个几乎相同,2个未知),并将其插入一个数据库,用于统计程序。我加载到的一个数据库经过优化,几乎不包含任何冗余。我从中获取的数据库都是生产数据库,它们的表设计非常糟糕(如果有的话),并且具有很高的冗余度。我的想法是加载5个数据库中的所有ID,然后将它们加载到统计数据库中,同时根据列表中的ID只获取一行,这意味着我的内存中只有我正在工作的内容在当前和所有行的ID上