2012-08-03 3 views
0

나는 큰 로그 파일을 읽어야하는 곳을 쓰고 싶은 간단한 도구의 설계 단계에 있습니다. 너희들에게 약간의 문맥을주기 위해 나는 그것에 대해 당신에게 뭔가를 먼저 설명 할 것이다. 로그의 많은 의미어떻게이 큰 텍스트 파일을 읽을 수 있습니까? 메모리 매핑 파일?

statistics : <some data which is more of less of the same length about 100 chars> 
request : <some xml string which can be small (10KB) or big (25MB) and anything in between> 
response : <ditto> 

로그 파일 크기의 약 100~600메가바이트 될 수 있습니다

내가 읽을 필요가 로그 파일

은 항상 다음과 같은 3 줄 형식으로 구성 로그 항목으로 구성 항목. 이제이 로그 항목들은 서로 관계를 가질 수 있습니다. 왜냐하면이 파일을 처음부터 끝까지 읽어야하기 때문입니다. 이러한 관계는 통계 라인에서 추론 할 수 있습니다.

통계 라인의 정보를 사용하여 사용자가 데이터를 검색하고 필터링 작업을 수행하는 데 사용할 수있는 일부 DataGrid를 구축하고자합니다. 이제는 사용자가 실제로 필요할 때까지 요청/응답 줄을 메모리에로드하고 싶지 않습니다. 또한로드 된 요청/응답 항목의 최대 값을 제한하여 메모리로드를 작게 유지하려고합니다.

그래서 처음으로 파일을 구문 분석하고 통계 인덱스를 만들 때 통계 라인의 오프셋을 저장해야한다고 생각합니다. 그런 다음 사용자가 로그 항목의 요소 인 일부 통계를 클릭하면이 오프셋을 사용하여 파일에서 요청/응답을 읽습니다. 그런 다음 요청/응답 항목을 많이로드하지 않도록주의를 기울이는 메모리 풀을 보유 할 수 있습니다 (이전 req 참조).

문제는 사용자가 요청/응답 데이터를 얼마나 자주 필요로하는지 알 수 없다는 것입니다. 그것은 몇 번 일 수있는 많을 수 있었다. 또한 네트워크 공유에서 로그 파일을로드 할 수 있습니다.

내가 가진 질문은 :

  1. 이 당신이 읽기 작업이 많이있을 수 있기 때문에 사실 메모리 매핑 된 파일을 사용해야 할 때 시나리오인가? 아니면 일반 파일 스트림을 사용하는 것이 좋습니다. BTW. 이 단계에서 로그 파일에 쓰기 작업을 할 필요는 없지만 앞으로는 가능할 수 있습니다!

내 생각에 다른 도움말이나 결함이있는 경우 지금까지 알려주세요. 나는 어떤 접근법에 대해서도 열려 있습니다.

업데이트 :

가 좀 더 명확히하려면 :

  • 자체가 사용자가 드라이브 나 네트워크 공유에서 로그 파일을로드 할 때 구문 분석을 수행하는 도구.

  • 이 도구는 WinForms 응용 프로그램으로 작성됩니다.

  • 사용자가 선택한 로그 항목을 내보낼 수 있습니다. 현재이 내보내기 형식은 알 수 없습니다 (이진, 파일 db, 텍스트 파일). 이 내보내기는 응용 프로그램 자체에서 가져올 수 있으며 사용자가 선택한 내용 만 보여줍니다.

+0

사이드 노트 : 당신의 목표가 무엇인지 생각해 봐야합니다. 지금 당신의 질문은 "나는 내가 원하는 것을 모르지만 충분히 빠릅니까?"입니다. "성능"으로 태그를 지정 했으므로 어떤 종류의 숫자가 염두에 있어야합니다. 나는. "메모리 부하를 적게"유지하는 것이 유일한 목표입니다. 한 번에 하나의 레코드 만 읽고 전체 파일을 순차적으로 탐색하는 것은 완벽합니다. ... 합리적인 요구 사항을 얻을 때까지는 최적화 할 수 없습니다. .. 데이터 .. "몇 번이면 될 수 있습니다."거의 정반대의 최적화가 필요합니다. –

답변

1

당신은 어쩌면 그냥 나야 ... 실제 항목 사이에 정의 관계를 맺고 일부 저장된 데이터에 대해 얘기하고 있지만,이 시나리오는 관계형 데이터베이스의 일종을 요구한다. 예를 들어, SQL Server CE와 같은 휴대용 데이터베이스를 고려해보십시오.그것은 당신의 삶을 훨씬 쉽게 만들고 필요한 기능을 정확하게 제공 할 것입니다. 대신 db를 사용하면 이와 같은 대용량 파일을 처리 할 필요없이 정확히 필요한 데이터를 쿼리 할 수 ​​있습니다.

+0

나는 이것에 대해서도 생각해 봤는데 아마도 더 나은 선택 일지 모르지만 나는 아직 확신하지 못했다. 이 시나리오에서는 전체 파일을 구문 분석해야합니다.이 파일은 저의 의견을 다른 솔루션에서 생각하기 시작했지만 어쩌면 틀 렸습니다. 유일한 단점은 초기 구문 분석 시간이 길어지고 불필요한 것입니다 (대부분 사용자가 특정 항목 만 찾고 있음). 내 질문의 일부는 여전히 텍스트 파일을 읽는 방법에 관한 것입니다. 내 질문을 지금 당장 열어두고 나중에 대답으로 표시 할 것입니다. +1하세요. –

+0

요청/응답 라인에 대한 바이트 오프셋을 인덱싱하면 어쨌든 전체 라인을 읽어야하기 때문에 db 옵션을 사용하기로 결정했습니다. 길이가 가변적이기 때문입니다. 이것을하기 위해 나는 그것을 정당화하기에 충분한 이익을 가져다주지 않는 자신의 스트림 리더를 만들어야 할 것이다. db 옵션을 사용하면 간단히 StreamReader를 사용할 수 있습니다. BTW SQL Server Compact에서 메모리를 처리하는 방법을 확인해야합니다. –

1

네트워크를 통해 요청/응답 청크를 보내는 경우 network send() 시간은 seek()/read()와 memmap을 사용하는 것의 차이보다 훨씬 클 것입니다 문제. 실제로이 스케일을 만들려면 간단하게 파일을 여러 파일로 분할해야합니다. 하나의 파일에 하나씩 ("요청"은 최대 25MB가 될 수 있기 때문에) 각 파일을 하나씩 만듭니다. 그런 다음 HTTP 서버는 가능한 한 효율적으로 해당 청크를 전송합니다 (웹 서버에 따라 zerocopy 사용). 작은 "요청"덩어리가 많고 거대한 소수의 덩어리가있는 경우 특정 임계 값을 초과하는 것만 깰 수 있습니다.

+0

나는 왜 내가 네트워크를 통해 이것을 보낼 것이라고 생각하는지 모르겠다.하지만 어쨌든 나는 내 대답을 떠날 것이다. Blam은 좋은 점을 가지고 있습니다. seek()/read()가 실제로 성능 문제라는 것을 보지 못했다면, 나는 그것에 대해 걱정하지 않을 것이다. – cwa

+0

답변 해 주셔서 감사합니다. 사용자가 잘못 선택했으면 네트워크 공유에서 로그 파일을로드 할 수 있습니다. 그것은 내가 로그를 생성하고 로그를 제공하는 프로세스를 제어 할 수 없다고 말했다. 그래서 이것은 정말로 나를위한 선택 사항이 아닙니다. 하지만 로그 파일을 네트워크 공유에서로드 할 때 memmap 파일을 사용할 때 이점이 없다는 것을 알고 있습니까? +1. –

0

나는 월터의 대답에 동의하지 않는다. 나는 db 또는 모든 기억을 갈 것입니다.

왜 메모리를 600MB로 저장하는 것이 그렇게 중요하지 않습니까? 2GB 미만의 메모리가있는 컴퓨터에서 실행 중이십니까?

통계를 키로 사용하여 값을 사전에로드하고 요청과 응답의 두 가지 속성을 갖는 값을 값으로 지정합니다. 사전은 빠릅니다. LINQ는 강력하고 빠릅니다.

+0

예. 실행되는 컴퓨터의 메모리는 2GB ~ 3GB입니다. 현재 머신은 머신이 실행중인 다른 모든 프로그램 때문에 이미 메모리가 부족합니다. 새로운 기계에 대한 예산은 없습니다. 귀하의 답변을 통해 당신은 mepmap 시나리오를 사용하지 않고 파일 스트림을 사용하지 않을 것이라고 생각합니까? –

+0

적절한 아키텍처라고 생각하면 코딩 공간이 1GB 미만이되지 않습니다. 당신은 누군가 당신의 사고에 결함이 있는지를 물었습니다. 그리고 거기에 당신이 가지고 있습니다. 나는 그것이 당신의 결함이라고 생각합니다. – Paparazzi

+0

효율성을 높이는 것이 내 사고의 결함이 아니라 아키텍처의 요구 사항 중 하나입니다. 하지만 여전히 당신의 대답에 감사드립니다. –

관련 문제