3 Stimmen

Wie man die Geschwindigkeit erhöht, um Clob-Daten in eine Datei zu schreiben

Wir extrahieren Daten aus einer Oracle-Datenbank in eine Datei mithilfe von C# oracleDataReader. Wir verwenden mehrere Threads und ich habe festgestellt, dass das Lesen von Daten außer clob sehr schnell ist, sagen wir, 4 Minuten für 1 GB. Aber wenn die Daten clob enthalten, ist es sehr sehr langsam, selbst 12 MB clob Daten benötigen etwa 3 Stunden.

Ich habe versucht, den Puffer von 64 KB auf 5 MB zu erhöhen.

Bitte schlagen Sie vor, wie die Geschwindigkeit erhöht werden kann, um clob in eine Datei zu schreiben.

Quellcode

Wir verwenden 2 Dateien, 1 für das tatsächliche CSV und 1 für clob. Wir schreiben recordpointer anstelle von clob in der CSV-Datei und in der clob-Datei schreiben wir recordpointer, clob-Wert.

else if (objVal is OracleClob)
{
    OracleClob oraVal = (OracleClob)objVal;
    if (oraVal.IsEmpty) 
        sw.Write("");
    else
    {
        //    using (StreamWriter writer = new StreamWriter(fileName, true))
        {
            Interlocked.Increment(ref recordPointer);
            if (recordPointer == 1)
            {
                string fileName = outputFileName.Remove(outputFileName.LastIndexOf("."));
                fileName = fileName + ".clobcsv";
                clobWriter = new StreamWriter(fileName, true);
                log.Info("CLOB-Daten wurden in dieser Datei gefunden " + outputFileName + " und clob-Daten sind in der Datei " + fileName + " gespeichert");
                clobWriter.WriteLine("Id," + cols[i]);
            }
            StringBuilder sb = new StringBuilder("\"");
            StringBuilder value = new StringBuilder();
            value.Append(oraVal.Value);
            //CsvEscape(value.ToString());
            value.Replace("\"", "\"\"");

            sb.Append(recordPointer);
            sb.Append("\"");
            sb.Append(delimiter);
            sb.Append("\"");
            //sb.Append(oraVal.Value.Replace("\"", "\"\""));
            sb.Append(value);
            value.Clear();
            sb.Append("\"");

            clobWriter.WriteLine(sb);
            //clobWriter.WriteLine("\"" + recordPointer + "\"" + delimiter + "\"" + oraVal.Value.Replace("\"", "\"\"") + "\"");                                    
        }
        sw.Write(recordPointer);
    }
}

0voto

0voto

Jon Heller Punkte 33222

Sie sollten vielleicht in Betracht ziehen, ein Oracle-Tool zum Exportieren von Daten zu verwenden. Es gibt viele Möglichkeiten, Datei-IO durchzuführen, und einige davon wären wahrscheinlich viel schneller als das, was Sie gerade tun. Zum Beispiel habe ich gerade dbms_xslprocessor.clob2file verwendet, um in 16 Sekunden ein 12 MB CLOB auf einem langsamen PC zu schreiben. Hier ist eine teilweise Liste von Optionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X