2014-11-07 2 views
1

grails 2.3.7 및 최신 Excel 가져 오기 플러그인 (1.0.0)을 사용하고 있습니다. 필자의 요구 조건은 엑셀 시트의 내용을 데이터베이스에 그대로 복사해야한다는 것입니다. 내 데이터베이스는 mssql 서버 2012입니다.거대한 데이터에 대해 Grails Excel 가져 오기가 실패합니다.

개발 버전에서 작동하는 코드가 있습니다. 이 코드는 레코드 수가 적거나 최대 몇백 개까지있을 때 잘 동작합니다.

그러나 생산 중에 엑셀 시트에는 최대 50,000 행과 75 개 이상의 열이 있습니다.

처음에는 메모리 부족 예외가 발생했습니다. 힙 크기를 8GB까지 늘렸으나 이제 스레드는 종료없이 계속 실행됩니다. 오류가 생성되지 않습니다.

이 작업은 잠시 동안 작동되며이 작업으로 인해 다른 작업이 수행되는 것을 방해하지 않는 사람이 수행합니다. 따라서이 작업의 막대한 부담에 대해 걱정할 필요가 있습니다. 나는 그것을 실행할 여유가있다.

동일한 수의 열로 기록이 10,000 개가되면 데이터가 약 5 분 안에 복사됩니다. 지금 내가 50,000 개의 행을 가지고 있다면 이상적으로 약 5 배 더 걸릴 것입니다. 이것은 약 25 분입니다. 그러나 코드는 종료없이 1 시간 이상 계속 실행되었습니다.

이 문제를 해결하는 방법을 알려주세요. 어떤 도움을 주셔서 감사합니다.

답변

0

메모리에 5 배 더 많은 데이터를로드하는 경우 항상 5 배는 더 걸리지는 않습니다. 나는 8GB의 대부분이 가상 메모리에 있고 가상 메모리는 하드웨어에서 매우 느린 것 같다. 메모리를 줄이고 일부 메모리 테스트를 실행하고 가능한 한 RAM을 사용해보십시오.

0

제 경험상, Grails의 대량 배치 작업에 일반적인 문제가 있습니다. 나는 메모리 누수가있어 작업이 크게 진행되면 속도가 느려진다 고 생각합니다.

내 솔루션은 Pentaho 주전자와 같은 ETL 도구를 가져 오기 위해 사용하거나 가져 오기를 관리 가능한 부분으로 가져 오는 것입니다. 문제에 기술적으로

Insert 10,000,000+ rows in grails

+0

문제점은 ETL을 사용할 수있는 옵션이 없습니다. 혼자서 그걸 할 필요가있어. – Rammohan

+0

그런 다음 Oliver의 접근 방식을 시도해보십시오. CSV로 작업하는 것이 훨씬 더 빨라질 수 있습니다. 코드가 진행될 때 속도가 느려지면 가져 오기를 더 작은 조각으로 덩어리로 만들 수 있습니다. 파일을 분할하는 것보다는 코드를 분할하는 것이 좋습니다. – wwwclaes

0

하지 대답하지만, 대신 엑셀의의 CSV를 사용하여 단지로 간주 한이 관련 질문을 참조?

사용자 입장에서 볼 때 가져 오기 전에 CSV로 저장하는 것은 많은 작업이 아닙니다.

200-300 000 행의 CSV를로드, 유효성 검사 및 저장하고 있습니다. 서비스에 로직이 있는지 확인하여 트랜잭션을 처리하도록하십시오.

아마도 csv를 해독하는 데 더 많은 코드가 필요할 수 있습니다. 특히 다양한 프리미티브로 변환하는 것이 더 빠릅니다.

+0

올리버 (Oliver)에게 감사드립니다. 나는 그것을 확실히 시도 할 것이다. – Rammohan

관련 문제