오라클 데이터베이스에서 C# oracleDataReader를 사용하여 데이터를 추출하는 중, 여러 스레드를 사용하고 있고 clob 이외의 데이터를 읽는 것이 매우 빠르다고합니다. 1GB의 분. 그러나 데이터에 clob이 포함되어 있으면 매우 느려지므로 12MB clob 데이터에도 약 3 시간이 걸립니다.clob 데이터를 파일에 기록하는 속도를 높이는 방법
버퍼를 64KB에서 5MB로 늘려 보았습니다.
파일에 clob을 작성하는 속도를 높이는 방법을 제안하십시오.
소스 코드 우리가이 개 파일 CLOB의 실제 CSV 1과 1을 사용하는
. 우리는 csv 파일에서 clob 대신 recordpointer를 작성하고 clob 파일에는 recordpointer, clob value를 작성합니다.
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 data is found in this file " + outputFileName + " and clob data is stored in " + fileName + " file");
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);
}
}
여러 스레드를 사용하고 있다고합니다. 읽는 동안 레코드를 잠그는 지 확인 했습니까? 잠긴 레코드를 기다리고 있으면 성능이 크게 저하됩니다. – RQDQ
@RQDQ 네, 몇 군데 있지만 다른 데이터는 clob을 제외하고는 매우 빠르게 로딩됩니다. –
@bunny - CLOB을 읽고 쓰는 코드는 어떻게 생겼습니까? – RQDQ