2009-09-16 2 views
0

나는 프로세스의 출력을 읽고 이것을 내부 형식으로 연속적으로 변환하는 분석 도구로 작업 중이다. "로깅 단계"가 완료되면 데이터에 대한 분석이 수행됩니다. 데이터는 모두 메모리에 보관됩니다.많은 양의 데이터를 분석 할 수있는 주문형 페이징

그러나 모든 로깅 된 정보가 메모리에 저장되어 있기 때문에 로깅 기간에 제한이 있습니다. 대부분의 유스 케이스의 경우 이것은 괜찮은 편이지만 성능을 해칠지라도 더 오랫동안 실행하려면 가능이어야합니다.

RAM 사용량이 일정한 한도에 도달하면 프로그램은 RAM 외에도 하드 드라이브 공간을 사용하여 시작할 수 있어야합니다.

이것은 내 질문에 이릅니다. 이렇게하는 기존 솔루션이 있습니까? 유닉스와 윈도우 모두에서 작동해야한다.

답변

0

응용 프로그램에 대해 잘 알지 못하면 완벽한 대답을 제공 할 수 없습니다. 그러나 당신이 바퀴를 다시 발명하고있는 것처럼 그것은 약간 소리가 난다. sqlite과 같은 in-process 데이터베이스 라이브러리 사용을 고려 했습니까?

만약 당신이 그것을 사용하거나 유사한 디스크와 메모리에서 데이터를 이동 돌봐 동시에 강력한 SQL 쿼리 기능을 제공합니다. 로깅 데이터가 사용자 정의 형식 인 경우에도 각 항목에 키 또는 인덱스가 있으면 작은 빛 데이터베이스가 적합 할 수 있습니다.

+0

SQLite 사용을 고려했지만 응용 프로그램의 많은 부분을 다시 작성해야합니다. 이것은 매우 드문 유스 케이스이므로 필자는 필요에 따라 단순히 디스크에 파일을 사용하는 것을 선호한다. – beta

0

메모리가 가득차면 디스크를 사용하려면 은 EhCache와 같은 캐시 기술을 사용합니다. 사용할 메모리 양과 디스크로 넘치기 위해 구성 할 수 있습니다.

그러나 그들은 또한 지난 10 분 동안 사용되지 않은 디스크 데이터로 보내는 것과 같이 필요에 따라 구성 할 수있는 더 똑똑한 알고리즘을 가지고 있습니다.

0

너무 명확하게 보일 수도 있지만 메모리 매핑 파일은 어떻게됩니까? 이것은 당신이 원하는 것을 수행하고 심지어 32 비트 응용 프로그램이 4GB 이상의 메모리를 사용하도록 허용합니다. 원칙은 간단합니다. 필요한 메모리를 디스크에 할당 한 다음 그 중 일부만 시스템 메모리에 매핑합니다. 예를 들어 사용 가능한 실제 메모리 크기의 75 %와 같은 것을 매핑 할 수 있습니다. 그런 다음 작업하고 데이터의 다른 부분이 필요하면 다시 매핑하십시오. 단점은 수동으로 매핑을 수행해야한다는 것입니다.하지만 반드시 나쁜 것은 아닙니다. 좋은 점은 실제 메모리와 프로세스 별 메모리 제한에 적합한 것보다 많은 데이터를 사용할 수 있다는 것입니다. 주어진 시간에 실제로 데이터의 일부만 사용하면 정말 좋습니다.

KLE에서 제안한 것과 같이이 작업을 자동으로 수행하는 라이브러리가있을 수 있습니다 (단 하나도 모릅니다). 수동으로 수행한다는 것은 디스크에 대해 많은 것을 배우고 더 많은 제어권을 갖게된다는 것을 의미합니다. 디스크가 언제 어떻게 사용되고 있는지와 관련하여 라이브러리가 원하는 경우 라이브러리를 선호합니다.

이 두 윈도우 유닉스에서 유사하게 작동합니다. Windows의 경우 간단한 예제를 보여주는 article by Raymond Chen입니다.

+0

그럴 수는 있지만 파일에 20 GiB의 데이터가 있고 파일의 시작, 중간 및 끝에서 데이터를 볼 필요가 있으면 상당히 복잡 할 것입니다. 필자의 이해가 정확하다면 파일의 일부를 mmap하고 기본적으로 내 자신의 메모리 관리자를 작성해야한다. – beta

+0

사실입니다. 무작위 접근은이 일을 더욱 복잡하게 만든다.스와핑 할 때 기본적으로 OS와 동일한 작업을 수행해야합니다. 당신이지도해야하는 부분을 미리 알고있는 것이 장점 일 것입니다. 그러나 가상 주소 공간에 적합하지 않은 것보다 많은 데이터로 작업하고 싶다면 어쨌든 그렇게해야합니다. 그렇게하고 싶지 않다면, 그렇게하는 라이브러리를 찾으려고 시도 할 수 있습니다. 성능을 위해 OS의 파일 시스템 캐싱 메커니즘에 의존하여 실제 파일을 조작 할 수도 있습니다. – OregonGhost

관련 문제