我已经创建了一个读取多个数据库并将其加载到另一个数据库的服务
内存使用量很大,所以现在我正在考虑减少内存使用量。
我有一段代码,我从两个不同的表中读取两个列到列表中 我的问题是有更多记忆效应的方法来做到这一点。
目前列表中大约有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
}
}
我已经删除了对我的问题不重要的代码。 为了澄清这个列表只包含行上的ID,然后我用它来获取行并将数据从一个db插入另一个db。
编辑:我遗漏了数据库的插入部分,因为它不是我现在正在看的部分。我知道可能还有一些东西可以到达,但我目前正在查看单个最大的平均内存用户,在这种情况下,我的列表来自3个数据库。
Edit2:我的想法是加载5个数据库的所有ID,然后将它们加载到统计数据库中,同时只根据列表中的ID获取一行意味着我的内存中唯一的东西是我目前正在做什么,以及所有行的ID 只是为了澄清5个数据库中的任何行是否有变化,我将根据我已经加载了ID的revisionTable来更新统计数据库。
提前致谢。
答案 0 :(得分:2)
这是两个数据库之间的接口吗?也许你可以在这里告诉我们yield
:
public IEnumerable<MyRecord> GetFromOriginalDB()
{
// some fetching magic
yield return myRecord;
}
public void WriteToTargetDB(IEnumerable<MyRecord> records)
{
foreach(var record in records)
{
// insert magic
}
}
记录不应保存在内存中(当前记录除外)。但是,这确实需要大量的重构,因为它可以工作......