2016-11-07 9 views
1

저는 현재 수백만 라인이 넘는 대용량 파일 또는 여러 파일을 읽는 프로젝트를 진행하고 있습니다. 그렇게하기 위해 Streamreader를 사용하여 각 행을 읽습니다. 모든 줄에 특정 문자열이 포함되어 있는지 확인합니다. 조건이 true이면 행을 추가합니다.MigraDoc에 많은 행을 추가하여 램 사용량을 줄이는 방법은 무엇입니까?

Table table = new Table(); 
Row row = new Row(); 
Cell cell = new Cell(); 
using(Streamreader sr = new Streamreader(file)) 
{ 
    string str; 
    while((str = sr.ReadLine()) != null) 
    { 
     if(str.Includes("Marker")) 
     { 
      row = table.AddRow(); 
      cell = row.Cells[0] 
      cell = row.Cells[1] // actually I use a counter variable, cause my table has 6 cells consistent. 
     } 
    } 
} 

그래서 매번 조건이 참이, 행 객체가 추가되고이 라인의 수백만도있을 것와 : 나는 내 앞에 있지 코드를 갖고 있기 때문에 나는 메모리에서 코드를 재현해야 내 RAM 메모리에 영향을 미치고 "폭발"할 가능성이 가장 큰 수백만 개의 개체입니다. 나는 여러 가지를 시도했다. 행 개체가있는 목록을 만들고 특정 번호 뒤에 지우십시오. 그러나 나는 그것이 숫양에서 물건을 지우지 않을 것임을 알아 내야 만했다 (list.Clear). 수동으로 가비지 수집기를 호출하려고했지만 성능에 부정적인 영향을줍니다. 그리고 지금 나는 이것을 처리하는 방법을 모르는 시점에 있습니다. 50 만 라인으로 거의 7GB의 RAM에 도달하고 8GB의 메모리를 사용할 수 있습니다.

나는 어떻게하면 높은 숫양을 피할 수 있는지, 아니면 최소한 숫양을 낮게 유지할 수 있는지 제안 해 주시면 감사하겠습니다.

나는 또한 아무것도 분명 느낌이 날에 그것을 밖으로 또는 지점 간 무료가 아닌 경우 I에 유래에 새로 온 것을 추가 할

: P에게

답변

2

당신은 옳은 일을하고있는 당신의 입력 파일을 읽어 스트림별로 줄 단위로 표시됩니다. 즉, 각 입력 파일의 현재 줄만 RAM에 있어야합니다.

그러나 표식 개체와 일치하는 각 줄에 대해 Table 개체에 행을 넣으면 잘못된 결과가 발생합니다. 이러한 테이블 개체는 RAM에 있습니다. 수백만 개의 Row 객체에 대한 Table 객체를 만들려고 시도하면 RAM을 사용하게됩니다.

dotnet 콜렉션 클래스는 방대한 콜렉션을 지원합니다. 그러나 RAM 사용에 대한 마법은 없습니다.

Table 개체의 Row 개체 수를 제한하는 방법을 찾아야합니다. 행 수를 추적 할 수 있고 특정 수 (10K ~ 100K가 얼마나 큰지 알고있는 사용자)가 테이블에 디스크를 쓰고 새 테이블을 만들 수 있습니까?

또한 Migradoc은 PDF 파일을 생성합니다. 백만 페이지 분량의 PDF 파일이 유용한 객체입니까? 그것은있을 것 같지 않습니다. RTF 파일과 동일합니다.

+0

빠른 답변을 주셔서 감사합니다. 나는 그것이 관리 할 수 ​​없다고 생각했다. 행 수를 추적 할 수 있으므로 제안을 구현하려고합니다. migradoc뿐만 아니라 rtf 문서도 생성 할 수 있습니다. – kuzurkurt