는 I는 다음과 같은 형식대용량 데이터 파일을 반복적으로 처리하는 방법은 무엇입니까?
CO_1 0 0 0 0 1
CO_2 0 0 0 0 1
이 데이터 파일에는 450 만 명 엔트리와 공간 분리 된 데이터 파일을 가지고 이 파일 100 번을 반복하는 알고리즘 인 Self-Organizing Map (SOM)에 대한 입력으로 사용됩니다.
다음 readFile 함수를 사용하여 파일을 임시 문자열로 완전히 복사하고 문자열을 SOM 알고리즘에 전달합니다. 내가 느끼는 지금까지 위의 방법은 메모리에 무거운 부담을두고 어떻게
public String readFile()
{
String temp = "";
try
{
FileReader file = new FileReader(FILE_LOCATION);
BR = new BufferedReader(file);
String strLine = null;
while((strLine = BR.readLine()) != null)
{
temp += strLine + "\n";
}
}
catch(Exception e)
{
}
return temp;
}
메모리 오버런이 발생할 수 반복 속도가 느려집니다. 현재 30GB 메모리 할당을 사용하는 클러스터에서이 코드를 실행 중이며 실행은 약 36 시간 동안 단일 반복을 완료하지도 못합니다.
초기 블록이 완료되면 SOM이 데이터를 폴링해야하기 때문에 파일을 부분적으로 읽을 수 없으므로 훨씬 더 복잡해집니다.
어떻게 개선 할 수 있었는지 아이디어를 얻었으므로 성공적으로 450 만 항목을 100 번 반복 할 수있었습니다.
편집
전체 파일은 한 번 위의 방법을 사용하여 문자열에 읽습니다. 그런 다음 문자열 변수가 100 회 반복되는 동안 사용됩니다. 그러나 매번 문자열 tokenizers는 파일 * 반복 횟수의 각 행을 처리하는 데 사용되었습니다.
파일을보다 효율적인 데이터 구조로 나타낼 수 있습니까? 예를 들어,''Map''에 대해''map.put (1, new BitSet())'형식의 항목을 갖는 경우는 무엇입니까? 여기서''1'' 키를 사용하여 문자열을 나타냅니다 나머지 문자열을 표현하기 위해''CO_1''과''0 0 0 0 1''을 포함하는 비트 셋을 사용합니까? –
gdiazc
@Synex 어떤 부분이 가장 오래 걸리는지 확인하기 위해 코드를 프로파일 링 해 보셨습니까? – Alan
@Alan 아니요. 어떤 제안? Eclipse IDE – Synex