我正在尝试在进程中获取可用内存,以确保我不会收到 OutOfMemoryException。我搜索了互联网,发现了几个如何使用但不可用的内存的示例。
让我提供用例...
我有一个正在执行批量插入的进程(使用 SqlBulkCopy)。我正在将 a 传递给DataTable
该WriteToServer
方法。我不能使用 aDataReader
因为我必须能够在失败时重试该过程。我的第一个想法是一次选择任意数量的行插入,比如 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);