2013-08-16 2 views
2

내 컴퓨터에 저장된 텍스트 파일에서 테이블을 채울 예정입니다. 이 말까지 약 백만 건의 레코드가있을 것입니다.하지만 채우기에는 너무 느립니다. 실제로 140000 레코드에 도달하는 데 12 시간이 걸렸습니다. while 루프를 사용하여 , 나는 각 레코드에 대해 필요한 정보를 추출,이 함수를 호출 :표를 채울 때 속도 저하를 방지하려면 어떻게해야합니까?

public void populateDB(int pid, String id, String title, String yearPublished, String author, String summary) { 

    Papers p = new Papers(); 
    p.setPid(pid); 
    p.setPaperId(id); 
    p.setTitle(title); 
    p.setYearPublished(yearPublished); 
    p.setAuthor(author); 
    p.setSummary(summary); 
    em.persist(p); 
    em.flush(); 
    System.out.println("Populated paper " + id); 

} 

을하지만이 반복의 수가 증가함에 따라 크게 속도가 느려집니다. 나는 이것이 CPU 사용량과 관련이 있다고 생각하는데, 이는 50 %로 제한되어있는 것 같습니다. 그러나 나는 이것을 늘리는 방법을 모른다. 최대 및 최소 스레드 풀은 10으로 설정됩니다. 어떻게 속도 저하를 막을 수 있습니까? 당신 루프의 높이를 갖는 글래스 피시 3.1.2.2 enter image description here

+0

어리석은 질문 ... 트랜잭션이 관련되어 있습니까? 거래를 일찍 처리 할 수 ​​있습니까? 배치 업데이트를 수행 할 수 있습니까? – MadProgrammer

+0

모든 단일 레코드에 대해 flush를 호출하면 엄청나게 느려질 것입니다. – jtahlborn

+0

또한 추출 코드를 표시하십시오. – jtahlborn

답변

0

잘 될 수 없습니다, 당신은 커밋 할 곳도 중요 할 것입니다. 고려해야 할 또 다른 요소는 테이블에 어떤 인덱스가 있는지입니다. 가져 오기를하는 동안 드롭 할 수 있습니까? 어쩌면 또한 일부 일괄 삽입 살펴 성능 향상에 도움이되는 몇 가지 팁

http://viralpatel.net/blogs/batch-insert-in-java-jdbc/

0

에서 :

1. 가능하다면, 그 다음의 7 개 라인을 압축하는 여러 가지 방법을 수행하기에 호출 한 줄? 모든 요청에 ​​

Papers p = new Papers(); 
p.setPid(pid); 
p.setPaperId(id); 
p.setTitle(title); 
p.setYearPublished(yearPublished); 
p.setAuthor(author); 
p.setSummary(summary); 

멀리 em.flush와 일을 고려

Papers p = new Papers(pid, id, title, yearPublished, author, summary); // Saves a lot of cycles. 

2로 교체() 및 콘솔 출력. 필요한 경우, 특정 카운트에서 if() 함수를 사용하여 수행 할 수 있습니다.

if(count/100 == 0) { // Reducing the number of expensive IOs 
em.flush() 
System.out.println("Populated paper " + id); 
} 
관련 문제