1

많은 질문을 게시하는 사람들과 웹 포럼에서 많은 답변을 비교하고 싶습니다. 질문을하고 질문에 답변하는 상위 10 명의 사용자를 인쇄해야합니다. 목록을 생성하는 스크립트를 작성했습니다. 그러나 너무 오래 걸리고 너무 많은 메모리를 사용하며 비효율적입니다.웹 포럼에서 많은 질문과 많은 답변을 게시 한 상위 10 명의 사용자 인쇄

내가 작성한 코드는 HashMap을 사용하고 있습니다. 사용자와 게시물의 .xml 파일은 매우 큽니다. 실제 데이터는 약 5-6 기가 바이트입니다.

시간, 효율성 및 성능을 향상시킬 수있는 가장 좋은 방법을 알아야합니다.

답변

0

몇 가지 방법이 있습니다

1) 수시로 업데이트 : 당신은 그것을 달성하기에 충분이 "실제"값, 당신은, 심지어 한 달에 한 번 (때때로 그것을 계산 보여 해달라고 귀하의 목표)를 저장하고 결과를 저장하십시오. 결과 만 표시합니다.

2) 중복 구조 사용 : 동일한 정보를 두 번씩 다르게 저장합니다. 각 정보는 다른 정보를 빨리 찾을 수 있도록하기 때문에 유용합니다. 예를 들어 포럼의 모든 게시물의 합계를 표시하고 하나씩 계산하지 않으려는 경우 추가 게시물을 추가 할 때마다 업데이트되는 추가 항목을 가질 수 있습니다.

무언가 잘못하면 데이터가 일치하지 않을 수 있으므로주의해야합니다 (단, 일부 멋진 비즈니스를 위해 중복 구조를 사용하는 경우 TOP 5를 표시하는 것과 같이 괜찮아요)

+0

이미 데이터가 있습니다 .. 지금 다른 열을 만들면 전체 데이터를 여전히 트래버스해야합니다. HashMap을 사용하면 5-6GB 데이터가 메모리에 저장되어 처리 속도가 느려집니다. 시간..다시 나는 이것이 일어나기를 원하지 않는다 .. – ArsenalRocks

0

무거운 타격 자 알고리즘을 사용하고 싶습니다. 그것은 멋지다. 1 패스 알고리즘입니다. 실시간으로 업데이트되거나 나중에 업데이트 될 수 있습니다.

사용자가 질문을하거나 답변을 게시 할 때마다 데이터 구조에 알리고 가장 중요한 "큰 타격꾼"을 추적합니다. 사용자 중 한 명이 최상위 k에서 탈퇴 할 즈음에는 약간 퍼지기 마련입니다. 아이디어

  • a blog post 설명

    • the research paper - 사용자 테이블에 두 개의 열을 추가 "무거운 타자 알고리즘"
  • +0

    나는 나의 코어의 수와 같은 쓰레드를 만들려고 생각하고있다. (8). 각 스레드는 고정 된 청크 크기 (예 : 512KB)를 처리하고 HashMap에 응답을 저장합니다. 이렇게하면 모든 데이터가 메모리에 저장되지 않으므로 메모리를 절약하고 프로세스 속도를 높일 수 있습니다. 그러나 나는 자바에서 이것을 할 수 있는지 확신하지 못한다. 내 코어에서 여러 스레드를 실행하려면 어떻게해야합니까? 나는 이것에 대해 걱정할 필요가 있습니까? – ArsenalRocks

    0

    에 대한 구글의 첫 번째 히트를 : 여기에

    몇 가지 리소스입니다 questions_count , answers_count. 메시지를 모두 메모리에 저장하는 대신 각 메시지를 검토하고 질문 또는 대답인지 확인한 다음 해당 메시지를 게시 한 사용자를 업데이트하십시오. 포럼 소프트웨어를 업데이트하여 메시지가 제출 될 때 분석을 수행하면 첫 번째 단계를 완료 한 후에 포럼에서 데이터를 업데이트 할 수 있습니다. 두 열을 사용하면 질문을하고 답하는 상위 10 명의 사용자를 얻는 두 가지 간단한 쿼리가됩니다.

    멋진 시간을 보내고 싶고 다른 시간대에 누가 물어보고 대답하고 있는지 추적하려면 ("올해 가장 많은 질문에 답하는 사람은 누구입니까?"또는 "올해 가장 많은 질문에 답한 사람은 누구입니까?") user_id, message_id, message_type(question|answer), timestamp을 추적하는 새 테이블을 생성하려고합니다. 이렇게하면 단일 SQL 호출로 대부분의 유형의 질문에 응답 할 수 있습니다.

    관련 문제