【发布时间】:2012-12-05 16:02:39
【问题描述】:
我正在尝试获取进程中的可用内存,以确保我不会收到 OutOfMemoryException。我在互联网上搜索并找到了几个如何获取内存已使用但不可用的示例。
让我提供用例...
我有一个正在执行批量插入的进程(使用 SqlBulkCopy)。我将DataTable 传递给WriteToServer 方法。我不能使用DataReader,因为我必须能够在失败时重试该过程。我的第一个想法是一次选择任意数量的行插入,比如 50,000。但这是一个不知道数据的通用过程;它不知道列数,也不知道每行中的数据量。所以我想我可以在向DataTable 添加行时监控内存,然后在内存快用完时将其发布到SqlBulkCopy。
这是一种有效的方法还是有更好的方法?
如果这是一种有效的方法,我将使用什么函数来确定可用内存量?
到目前为止,这是我的代码...AvailableMemoryIsLow 是我无法确定的。
// m_buffer is a read-once cache (implements IDataReader) that pulls
// data from an external source as needed so it uses very little memory.
// My original implementation just used m_buffer as the parameter of
// WriteToServer but now I have to add retry logic into the process.
DataTable dataTable = new DataTable(m_tableName);
foreach (DataField d in m_buffer.GetColumns())
dataTable.Columns.Add(new DataColumn(d.FieldName, d.FieldType));
while (m_buffer.Read())
{
DataRow row = dataTable.NewRow();
for (int i = 0; i < m_buffer.FieldCount; i++)
row[i] = m_buffer.GetValue(i);
dataTable.Rows.Add(row);
// How do I determine AvailableMemoryIsLow
if (rowCount++ >= 50000 || AvailableMemoryIsLow)
{
PutDataIntoDatabase(dataTable);
dataTable.Clear();
rowCount = 0;
}
}
if (dataTable.Rows.Count > 0)
PutDataIntoDatabase(dataTable);
【问题讨论】: