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);
}
}