2011-03-18 5 views
3

오라클 데이터베이스에서 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); 
    } 
} 
+1

여러 스레드를 사용하고 있다고합니다. 읽는 동안 레코드를 잠그는 지 확인 했습니까? 잠긴 레코드를 기다리고 있으면 성능이 크게 저하됩니다. – RQDQ

+0

@RQDQ 네, 몇 군데 있지만 다른 데이터는 clob을 제외하고는 매우 빠르게 로딩됩니다. –

+0

@bunny - CLOB을 읽고 쓰는 코드는 어떻게 생겼습니까? – RQDQ

답변

0

데이터를 내보내는 데 Oracle 도구를 사용해보십시오. 파일 IO를 수행하는 방법은 여러 가지가 있으며 그 중 일부는 수행하는 것보다 훨씬 빠릅니다. 예를 들어 느린 PC에서 16 초 만에 12MB CLOB를 작성하기 위해 dbms_xslprocessor.clob2file을 사용했습니다. Here's a partial list of options.

관련 문제