2008-09-26 7 views
9

원격 컴퓨터에서 여러 로그 파일을 구문 분석해야하는 데 문제가 있습니다. 몇 가지 합병증이 있습니다 1) 파일이 파일은 (메가 바이트 +) 3) 각 항목은네트워크를 통해 큰 텍스트 파일을 읽고 구문 분석하는 가장 좋은 방법은 무엇입니까?

가 사용 중 문제를 해결하려면 여러 줄 수 있습니다 매우 클 수있다)를 사용 2에있을 수 있습니다, 먼저 복사해야합니다. 현재 원격 컴퓨터에서 로컬 컴퓨터로 직접 복사하고 거기에서 구문 분석합니다. 문제는 2 번으로 이어집니다. 파일이 상당히 크기 때문에 로컬로 복사하는 데 꽤 오래 걸릴 수 있습니다.

파싱 시간을 늘리기 위해 파서를 멀티 스레드로 만들고 싶습니다.하지만 멀티 라인 엔트리를 다루는 것이 다소 번거로 롭습니다.

두 가지 주요 문제는 다음과 같습니다? 1)? 나는 사용 파일에 다른 방법으로 읽어?, 심지어이 켜지지 로컬 수 전송되어) 2) 파일 전송 (압축 속도를 어떻게 내가 어떻게 할 쓰레드간에 라인을 분할 할 때 멀티 라인 엔트리를 다루는가?

업데이트 : 서버 이유에 대한 명백한 구문 분석을 수행하지 않은 이유는 가능한 한 작은 CPU 영향을주고 싶다는 것입니다. 나는 시스템 테스트의 성능에 영향을 미치고 싶지 않다.

답변

2

순차 파일을 읽는 경우 네트워크를 통해 한 줄씩 읽으려고합니다. 스트리밍 할 수있는 전송 방법이 필요합니다. 이 문제를 파악하려면 IO 스트리밍 기술을 검토해야합니다.

대규모 IO 작업은 네트워크를 통해 읽을 수있는만큼 빨리 항목을 처리 할 수 ​​있기 때문에 멀티 스레딩을 많이 사용하지 않습니다.

다른 좋은 옵션은 로그 파서를 서버에두고 결과를 다운로드하는 것입니다.

+0

네트워크를 통해 직접 100MB 텍스트 파일을 복사하는 데 x 초가 걸리고 원격 클라이언트에서 압축하여 파일을 보낸 다음 수축/읽기에 x/4 초가 걸리므로 그만한 가치가 있지 않습니까? (참고, 실제로 얼마나 오래 압축/전송/압축 풀기/읽기 걸릴지는 모르겠다.) – midas06

+0

꼭 당신은 네트워크를 통해 약간의 압축을 사용할 수있다. 내가 말했듯이, IO 스트리밍 옵션을 검토하십시오. 일부 사람들은 일부 zip 라이브러리를 제안했습니다. OTOH 당신이 원격지에 프로그램을 넣을 수 있다면, 거기에서 처리를해라! –

1

가장 쉬운 방법은 복사하기 전에 파일을 압축하고 복사가 완료되면 압축을 푸는 것입니다. zip 알고리즘이 일반적으로 잘 작동하기 때문에 텍스트 파일을 압축하면 엄청난 이득을 얻을 수 있습니다. 또한 기존의 구문 분석 논리를 원격 네트워크 텍스트 판독기에 연결하지 않고 그대로 유지할 수 있습니다.

이 방법의 단점은 라인 단위의 업데이트를 매우 효율적으로 수행 할 수 없으므로 로그 파서를 사용하는 것이 좋습니다.

+0

나는 그것을 압축하고 싶지만 내 코드가 로컬 컴퓨터에서 실행 중이면 전송 후 압축되어 목적을 이길 것입니다. 나는 아프다고 생각하지만 아무것도하지 않고 압축하고 보내는 clientt를 작성해야합니다. – midas06

0

대용량 파일을 인터넷을 통해 전송하기 전에 압축하기 위해 SharpZipLib을 사용했습니다. 이것이 하나의 선택입니다.

1)에 대한 또 다른 아이디어는 원격 컴퓨터에서 실행되는 어셈블리를 만들고 거기에서 구문 분석을하는 것입니다. .NET 원격을 사용하여 로컬 컴퓨터에서 어셈블리에 액세스 할 수 있습니다. 원격 어셈블리는 Windows 서비스이거나 IIS에서 호스팅되어야합니다. 그러면 동일한 시스템에 로그 파일의 사본을 보관할 수 있으며 이론적으로 로그 파일을 처리하는 데 시간이 덜 걸립니다.

0

나는 그것이 얼마나 "원격"에 따라 생각

1

도움이 될 압축 (/ GZIP을 수축)를 사용하여 생각합니다. 100MB LAN에서 100MB는 약 8 초가 걸릴 것입니다. 기가비트까지 올라가면 1 초 정도 걸릴 것입니다. 카드의 경우 $ 50 * 2, 스위치의 경우 $ 100은 할 수있는 매우 저렴한 업그레이드입니다.

그러나 더 멀리 있다고 가정하면 읽기 모드로 열 수 있어야합니다 (복사 할 때 읽는 것처럼). SMB/CIFS는 파일 블록 읽기를 지원하므로 해당 시점에 파일을 스트리밍해야합니다. 물론 파일에 액세스하는 방법을 실제로 말하지 않았습니다. 단지 SMB라고 가정합니다.

멀티 스레딩은 도움이되지 않습니다. 어쨌든 디스크 나 네트워크에 바인딩 될 수 있습니다.

1

전송 압축을 사용하십시오.

구문 분석으로 인해 처리 속도가 느려지고 프로세서가 여러 개있는 경우 파싱 작업을 중단 할 수 있습니다. 스마트하게 처리해야합니다. 결정적인 알고리즘으로 작업자가 처리해야합니다. 불완전한 기록들. 예를 들어, 라인이 레코드의 중간에 있다고 결정할 수 있다고 가정하면, 파일을 N 개의 M 세그먼트로 나눌 수 있습니다. 각 세그먼트는 M 개의 라인을 담당합니다. 작업 중 하나가 해당 레코드가 완료되지 않았다고 결정하면 레코드의 끝에 도달 할 때까지 계속해서 읽어야합니다. 작업 중 하나가 시작이없는 레코드를 읽는 것으로 결정되면 레코드를 건너 뜁니다.

1

성능면에서 더 나은 옵션은 원격 서버에서 구문 분석을 수행하는 것입니다. 예외적 인 경우를 제외하고는 네트워크 속도가 항상 병목 현상이 될 수 있으므로 네트워크를 통해 전송하는 데이터의 양을 제한하면 성능이 크게 향상됩니다.

이렇게 많은 데이터베이스가 서버 쪽에서 실행되는 저장 프로 시저를 사용하는 이유 중 하나입니다.

멀티 스레딩을 사용하여 구문 분석 속도가 향상되면 네트워크 전송 속도가 상대적으로 빨라집니다.

파일을 구문 분석하기 전에 파일을 전송하려는 경우 파일 전송 중에 직접 압축을 사용하는 것이 좋습니다. 예를 들어, 즉시 사용할 수있는 sftp 서버가 있습니다. 로컬 엔드에서 libcurl과 같은 것을 사용하여 전송의 클라이언트 측을 수행 할 수 있으며, 또한 전송 중 압축 해제를 지원합니다.

1

파일을 복사 할 수 있으면 읽을 수 있습니다. 따라서 처음부터 복사 할 필요가 없습니다.

EDIT : FileStream class을 사용하면 액세스 및 공유 모드를보다 잘 제어 할 수 있습니다.

new FileStream("logfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 

트릭을 수행해야합니다.

+0

나는 거기서 다른 것을 간청한다. 스트림을 통해 구문 분석을 시도 할 때 use in을 복사하는 것이 효과가 있다는 것은 제 경험에 의한 것입니다. 내 이론은 복사가 허용하는 다른 Windows API를 사용한다는 것입니다. – midas06

+0

당신의 이론이 잘못되었습니다. Windows 탐색기는 동일한 API .NET (및 FileStream) 용도를 사용합니다. 너 해봤 니? – VVS

관련 문제