문제

자, 불행히도 큰 데이터 구조를 사용하여 작업을 완료 해야하는 프로그램을 작성하고 있지만 초기화 중에 "메모리 외 오류"로 실패하고 있습니다. 나는 그것이 무엇을 의미하는지, 그것이 왜 그것이 문제인지를 완전히 이해하고 있지만, 나는 프로그램 이이 큰 구조를 사용해야하고 그것을 저장할 다른 방법을 모르기 때문에 그것을 극복하는 데 어려움을 겪고 있습니다.

이 프로그램은 먼저 내가 제공하는 대형 텍스트 파일을 색인합니다. 이것은 잘 작동합니다.

그런 다음이 색인을 사용하여 큰 2D 배열을 초기화합니다. 이 배열에는 n² 항목이 있으며, 여기서 "n"은 텍스트 코퍼스의 고유 한 단어 수입니다. 비교적 작은 청크의 경우 (약 60 파일) 테스트하고 있습니다. 약 30,000x30,000 항목을 만들어야합니다. 내가 의도 한 코퍼스에서도 실행되면 이것은 아마도 더 커질 것입니다.

데이터 구조를 초기화하는 반면 (나중에 작업 할) 인덱스 후 매번 일관되게 실패합니다.

내가 한 일은 다음과 같습니다.

  • 원시를 사용하도록 내 코드를 개선하십시오 int[] 대신 a TreeMap
  • 중복 구조 등을 제거하십시오 ...
  • 또한 프로그램을 실행했습니다-Xmx2g 할당 된 메모리를 최대화하기 위해

나는 이것이 간단한 코드 솔루션 라인이 아니라고 확신하지만, 매우 새로운 접근법이 필요할 가능성이 높습니다. 나는 그 접근법이 무엇인지, 어떤 아이디어가 있는지 찾고 있습니까?

감사합니다, B.

도움이 되었습니까?

해결책

그것은 (배열에 사용하는 것에 대해 몇 가지 가정을 만드는 것) 대부분의 항목은 0입니다. 그렇다면 사용하는 것이 좋습니다. 드문 매트릭스 대표.

당신이 정말로 가지다 그 많은 항목 (현재 배열은 어딘가에 있습니다 이미 3 기가 바이트 이상, 오버 헤드가 없다고 가정하더라도) 어떤 종류의 온 디스크 스토리지 또는 게으른로드/언로드 시스템을 사용해야합니다.

다른 팁

메모리 문제의 몇 가지 원인이 있습니다.

첫째, 가장 간단한 경우는 더 많은 힙이 필요하다는 것입니다. 프로그램이 2G로 올바르게 작동 할 때 512m 최대 힙을 사용하고 있습니다. 증가합니다 -Xmx2048m JVM 옵션으로 괜찮습니다. 또한 64 비트 VM보다 해당 데이터의 구성에 따라 32 비트 VM의 메모리의 최대 두 배를 사용합니다.

문제가 그렇게 간단하지 않으면 최적화를 볼 수 있습니다. 객체를 프리미티브 등으로 교체합니다. 이것은 옵션 일 수 있습니다. 나는 당신이 게시 한 내용에 따라 실제로 말할 수 없습니다.

궁극적으로 당신은 당신이 선택 해야하는 크로스 도로에옵니다. 미덕화 그리고 분할.

가상화 이러한 맥락에서 단순히 척하는 척하는 형태의 기억이있는 것보다 더 많은 형태가 있음을 의미합니다. 운영 체제는 가상 주소 공간과 하드 디스크 공간을 추가 메모리로 사용합니다. 이는 일부 데이터 구조를 한 번에 메모리에 유지하고 나머지를 보조 스토리지 (예 : 파일 또는 데이터베이스)로 유지하는 것을 의미 할 수 있습니다.

분할 여러 서버 (실제 또는 가상)에서 데이터를 분할하고 있습니다. 예를 들어, NASDAQ에서 주식 거래를 추적하는 경우 Server2의 "A"A "A On Server1, B"로 시작하여 재고 코드를 넣을 수 있습니다. 또는 교차 의사 소통이 확장 성을 제한하기 때문에 교차 의사 소통의 필요성을 제거하십시오.

간단한 경우, 저장하는 것이 30k 단어와 30k x 30k 단어의 조합이라면 4 개의 서버로 나눌 수 있습니다.

  • am X AM
  • am x nz
  • NZ X AM
  • NZ X NZ

그것은 단지 하나의 아이디어 일뿐입니다. 다시 한 번 세부 사항을 알지 못한 채로 어려운 일입니다.

이것은 큰 데이터 세트를 다루는 일반적인 문제입니다. 원하는만큼 최적화 할 수 있지만 메모리는 결코 충분하지 않을 것이며 (아마도) 데이터 세트가 조금 더 커지 자마자 여전히 담배를 피 웁니다. 가장 확장 가능한 솔루션은 단순히 메모리를 덜 유지하고 청크 작업을하며 디스크 (데이터베이스/파일)의 구조를 지속하는 것입니다.

2D 배열의 각 값에 대해 32 비트 (정수 크기)가 필요하지 않으면 바이트와 같은 작은 유형이 트릭을 수행 할 수 있습니까? 또한 가능한 한 많은 힙 공간을 제공해야합니다. 2GB는 현대 시스템의 경우 여전히 비교적 작습니다. RAM은 저렴합니다. 특히 메모리에서 많은 처리를 할 것으로 예상되는 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top