C #- 12k의 데이터로 6 초마다 업데이트되는 이진 로그 파일에서 읽기

StackOverflow https://stackoverflow.com/questions/1170538

  •  19-09-2019
  •  | 
  •  

문제

센서 (Int16)의 스트리밍 데이터가있는 이진 로그 파일이 있습니다.
6 초마다 센서가 분리 될 때까지 6000 개의 유형 int16 샘플이 추가됩니다.

마지막 위치에서 계속 해서이 파일을 정기적으로 설문 조사해야합니다. a) 판독 값 사이에 파일 스트림 및 이진 판독기를 열고 인스턴스화하는 것이 더 나은가요? b) 읽을 필요가있을 때마다 (마지막 위치 판독을 추적하기 위해 외부 변수를 유지) c)

편집 : 지금까지 몇 가지 좋은 제안은 "서버"앱이 외부 소스 공급 업체가 제공하고 수정할 수 없다고 덧붙여 야합니다.

도움이 되었습니까?

해결책

항상 동일한 양의 데이터를 추가하는 경우 다시 열어주는 것이 합리적 일 수 있습니다. 길이를 열기 전에 길이를 찾은 다음 여전히 데이터를 작성하는 동안 잡을 경우를 대비하여 사용 가능한 "샘플 세트"수로 반올림 할 수 있습니다. 그것은 당신이 당신보다 덜 읽는 것을 의미 할 수 있습니다 ~할 수 있었다 읽기 (쓰기가 길이를 확인하고 읽기 시작 사이에 쓰기가 끝나는 경우) 그러나 다음에 따라 잡을 것입니다.

작가가 읽는 동안 여전히 글을 쓸 수 있도록 적절한 공유 옵션을 사용해야합니다. (작가는 아마도 이것을 염두에두고 쓰여졌을 것입니다.)

다른 팁

당신은 사용할 수 있습니까? 메모리 맵핑 파일?

가능하면 메모리에 파일을 매핑하고 프로세스간에 공유하면 매번 포인터의 오프셋을 증가시켜 데이터를 읽을 수 있습니다.

이벤트와 결합되면 독자가 정보를 읽을 수있을 때 알 수 있습니다. 독자가 항상 작성된 "오래된"데이터를 읽으면서 아무것도 차단할 필요가 없습니다.

파이프를 사용하는 것이 좋습니다. 앱이 다른 PC에서 실행 되더라도 응용 프로그램 간의 스트림 데이터를 제외하고는 파일처럼 작동합니다 (실제로 두 응용 프로그램을 변경할 수있는 경우에만 옵션 일뿐입니다). "System.io.pipes"네임 스페이스 아래에서 확인하십시오.

추신 : 당신은 이것에 "명명 된"파이프를 사용합니다 (파이프는 'c'에서도 지원되므로 기본적으로 절반의 괜찮은 프로그래밍 언어를 구현할 수 있어야합니다).

나는 (a)가 최고라고 생각합니다.

  • 읽을 때 현재 위치는 증가하며 어딘가에 보관할 걱정이 필요하지 않습니다.
  • 당신은 그것을 열고 필요한 위치를 찾을 필요가 없습니다 (다시 열기는 느리지 않지만 열린 상태를 유지하면 내가 믿는 최적화에 대한 힌트를 제공합니다).
  • 내가 생각할 수있는 다른 솔루션은 System Interprocess Synchronization Primitives에 pinvokes가 필요합니다. 그리고 이미 프레임 워크에있는 파일 작업보다 빠르지 않습니다.

적절한 Fileshare 플래그를 설정하면됩니다.

예를 들어 :

섬기는 사람:

using(var writer = new BinaryWriter(new FileStream(@"D:\testlog.log", FileMode.Append, FileAccess.Write, FileShare.Read)))
{
    int n;
    while(Int32.TryParse(Console.ReadLine(), out n))
    {
        writer.Write(n);
        writer.Flush(); // write cached bytes to file
    }
}

고객:

using (var reader = new BinaryReader(new FileStream(@"D:\testlog.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
    string s;
    while (Console.ReadLine() != "exit")
    {
        // allocate buffer for new ints
        Int32[] buffer = new Int32[(reader.BaseStream.Length - reader.BaseStream.Position) / sizeof(Int32)];

        Console.WriteLine("Stream length: {0}", reader.BaseStream.Length);
        Console.Write("Ints read: ");
        for (int i = 0; i < buffer.Length; i++)
        {
            buffer[i] = reader.ReadInt32();
            Console.Write((i == 0 ? "" : ", ") + buffer[i].ToString());
        }
        Console.WriteLine();
    }
}

또한 파일을 다른 대안으로 대신 데이터베이스로 스트리밍 할 수도 있고 파일 잠금에 대해 걱정할 필요가 없습니다.

그러나 파일 메소드가 붙어 있으면 파일을 읽을 때마다 파일을 닫을 수 있습니다. 파일에 대한 프로세스가 얼마나 복잡한 지, 파일 잠금 작업을 감지하고 끔찍하게 충돌하지 않고 적절하게 응답 할 수 있는지 여부에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top