Optimización C #: Insertando 200 millones de filas en la base de datos

c# datatable sqlbulkcopy

Pregunta

Tengo el siguiente código (simplificado) que me gustaría optimizar para la velocidad:

long inputLen = 50000000; // 50 million 
DataTable dataTable = new DataTable();
DataRow dataRow;
object[] objectRow;
while (inputLen--)
{
    objectRow[0] = ...
    objectRow[1] = ...
    objectRow[2] = ...

    // Generate output for this input
    output = ...

    for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000
    {
         objectRow[3] = output[i];
         dataRow = dataTable.NewRow();
         dataRow.ItemArray = objectRow;
         dataTable.Rows.Add(dataRow);
    }
}

// Bulk copy
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null);
bulkTask.DestinationTableName = "newTable";
bulkTask.BatchSize = dataTable.Rows.Count;
bulkTask.WriteToServer(dataTable);
bulkTask.Close();

Ya estoy usando SQLBulkCopy en un intento de acelerar las cosas, pero parece que la asignación de valores al DataTable en sí resulta lenta.

No sé cómo funcionan las DataTables, así que me pregunto si estoy creando una sobrecarga innecesaria creando primero una matriz reutilizable, luego asignándola a una DataRow y luego agregando la DataRow a la DataTable. ¿O el uso de DataTable no es óptimo en primer lugar? La entrada proviene de una base de datos.

No me importa mucho el LOC, solo la velocidad. ¿Alguien puede dar algún consejo sobre esto?

Respuesta aceptada

Para una mesa tan grande, deberías usar la

public void WriteToServer(IDataReader reader)

método.

Puede significar que tendrá que implementarse una interfaz IDataReader "falsa" con su código (si no obtiene los datos de un IDataReader existente), pero de esta manera, obtendrá una "transmisión" de punta a punta. , y evitará un bucle de 200 millones.


Respuesta popular

En lugar de mantener una enorme tabla de datos en la memoria, sugeriría implementar un IDataReader que sirva los datos a medida que se realiza la copia masiva. Esto reducirá la necesidad de mantener todo en la memoria por adelantado y, por lo tanto, debería servir para mejorar el rendimiento.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué