c# - sacar - ¿Cómo puedo obtener un porcentaje de LINQ to SQL submitchanges?
formula para sacar el porcentaje (4)
Me pregunto si alguien más hizo una pregunta similar.
Básicamente, tengo un árbol enorme que estoy construyendo en la RAM usando objetos LINQ, y luego lo vuelvo a poner de una vez usando DataContext.SubmitChanges()
.
Funciona, pero no puedo encontrar cómo dar al usuario una especie de indicación visual de hasta dónde ha progresado la consulta hasta el momento. Si finalmente pudiera implementar una especie de barra de progreso, sería genial, incluso si hay una pérdida mínima en el rendimiento.
Tenga en cuenta que tengo una gran cantidad de filas para poner en la base de datos, más de 750,000 filas. No lo he cronometrado exactamente, pero toma mucho tiempo ponerlos.
Edición: pensé que sería mejor dar alguna indicación de lo que estoy haciendo.
Básicamente, estoy construyendo un árbol de sufijos del Señor de los Anillos. Por lo tanto, hay muchos Nodos, y ciertos Nodos tienen posiciones asociadas a ellos (Nodos que se encuentran al final de un sufijo). Estoy construyendo los objetos Linq a lo largo de estas líneas.
suffixTreeDB.NodeObjs.InsertOnSubmit(new NodeObj()
{
NodeID = 0,
ParentID = 0,
Path = "$"
});
Después de que el árbol de sufijos se haya generado completamente en la RAM (que solo lleva unos segundos), entonces suffixTreeDB.submitChanges();
Lo que me pregunto es si hay alguna forma más rápida de hacerlo. ¡Gracias!
Edición 2: hice un cronómetro, y aparentemente tarda exactamente 6 minutos para que se escriba el DB.
Esto no es ideal, pero podría crear otro hilo que periódicamente consulte la tabla que está rellenando para contar la cantidad de registros que se han insertado. No estoy seguro de cómo / si esto funcionará si está ejecutando una transacción, ya que podría haber bloqueo / etc.
Lo que realmente creo que necesito es una forma de Bulk-Insert, sin embargo, parece que Linq no lo admite.
Le sugiero que divida las llamadas que está haciendo, ya que se envían en llamadas separadas a la base de datos de todos modos. Esto también reducirá el tamaño de la transacción (lo que linq hace al llamar a sendchanges).
Si los divide en 10 bloques de 75,000, puede proporcionar una estimación aproximada en una escala 1/10.
Actualización 1: después de volver a leer su publicación y sus nuevos comentarios, creo que debería echarle un vistazo a SqlBulkCopy. Si necesita mejorar el tiempo de la operación, ese es el camino a seguir. Compruebe esta pregunta / respuesta relacionada: ¿Cuál es la forma más rápida de insertar a granel una gran cantidad de datos en SQL Server (cliente C #)?
Pude obtener un porcentaje de progreso para ctx.submitchanges () usando ctx.Log y ActionTextWriter
ctx.Log = new ActionTextWriter(s => {
if (s.StartsWith("INSERT INTO"))
insertsCount++;
ReportProgress(insertsCount);
});
más detalles están disponibles en mi blog http://epandzo.wordpress.com/2011/01/02/linq-to-sql-ctx-submitchanges-progress/
y pregunta LINQ to SQL SubmitChangess () progreso