내 입력 데이터는 하나의 목록에 50,000 (또는 그 이상)의 전자 메일 메시지이며 to, cc 및 bcc의 여러 수신자에게 엄청난 중복이 있습니다. 따라서이 목록에서 고유 한 메시지를 추출해야합니다.스레드, Arraylist 메모리에 미치는 영향 - Java
동일하거나 유사한지를 식별하기 위해 Message의 특정 속성 (From, List 및 Include (String only))을 비교해야합니다.
지금이 50,000 개의 메시지를 50 개의 작은 1000 개의 메시지 목록으로 나누고 스레드의 각 작은 목록의 복제본을 실행합니다.
모든 스레드가 출력을 하나의 목록에 추가하고 마지막으로 해당 스레드의 중복을 검사합니다. JVM이 1.25GB 메모리에 도달하는 동안.
따라서 내가 시도한 후 50,000 개 이상의 메시지를 보내면 메모리 부족 오류가 발생합니다.
removeDeduplicate(array of messages, blank list)
이라는 메소드가 있는데, 메시지 배열과 빈리스트를 입력으로 사용하고 그 빈리스트에서 고유 메시지를 리턴합니다. 이 내 코드입니다 : 내가 너무 미세 조정 메모리 향상 및 성능에 대한 내 코드를 시도하고
public Message[] processForDeduplication(Message[] msgs) throws MessagingException, IOException, InterruptedException {
final List<Message> output = new ArrayList<Message>();
if(msgs.length < MAX_MSG){
output.addAll(removeDeduplication(msgs, new ArrayList<Message>()));
} else {
List<Thread> threads = new ArrayList<Thread>();
int index = 0, lastIndex = MAX_MSG;
while(index < msgs.length){
if(lastIndex >= msgs.length) {
lastIndex = msgs.length;
}
final Message[] temp = Arrays.copyOfRange(msgs, index, lastIndex);
Thread t = new Thread(new Runnable(){
@Override
public void run() {
try {
output.addAll(removeDeduplication(temp, new ArrayList<Message>()));
} catch (MessagingException ex) {
logger.error(EmailComparator.class.getName() + ex);
} catch (IOException ex) {
logger.error(EmailComparator.class.getName() + ex);
}
}
});
t.start();
threads.add(t);
index = lastIndex;
lastIndex = lastIndex + MAX_MSG;
}
for(Thread t: threads){
while(t.isAlive()){
Thread.sleep(100);
}
}
threads = null;
}
List<Message> results = removeDeduplication(convertToArray(output), new ArrayList<Message>());
return convertToArray(results);
}
. 지금은 5 ~ 6 초가 될 50,000 개의 레코드를 완료하는 데 약 12-15 초가 걸립니다.
당신은 새 스레드마다 루프를 만들 수 있습니다.하나의 스레드를 생성하고 인스턴스를 처리 할 대기열에 추가하십시오. –
나는 아주 비슷한 문제를 여기에서 해결했다 : http://stackoverflow.com/questions/14737541/java-creating-threads-in-a-eventlistener/14737583#14737583 –
@Legend 그러나 그 말은 모든 일을하는 한 개의 실이 느슨한 것을 의미한다. 다중 처리가 필요하며 오랜 시간이 걸릴 것입니다. – bhavin