Span<T>, Memory<T> - slog(완료)

조금 더 다른 접근을 해봤습니다. 만약, MemoryMappedFile을 이용해 Span<byte>을 획득할 수 만 있다면, 좀 더 효율적인 대량 데이터를 빠르게 처리할 수 있을꺼라 생각했습니다.

확인한 결과, 어쩔 수 없이 unsafe영역을 사용해야 했고, decimal이 고정 배열이 안된다는 사실도 알게 되었지만, 어쨌든 상당히 빠른 속도로 목록(Span<실시간시세2>)을 생성할 수 있었습니다.

void 임의시세목록_읽기2()
{
    var filename = "실시간시세.dat";
    var fileLength = new FileInfo(filename).Length;

    using var mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open);
    using var accessor = mmf.CreateViewAccessor();

    Span<byte> memory;
    unsafe
    {
        byte* ptr = null;
        accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);
        ptr += accessor.PointerOffset;

        //memory = new Span<byte>(ptr, (int)accessor.SafeMemoryMappedViewHandle.ByteLength);
        memory = new Span<byte>(ptr, (int)fileLength);
    }


    var 실시간시세목록 = MemoryMarshal.Cast<byte, 실시간시세2>(memory);
    foreach (var item in 실시간시세목록)
    {
        ;
    }

    accessor.SafeMemoryMappedViewHandle.ReleasePointer();
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct 실시간시세2
{
    public long 체결시각;
    public decimal 체결가;
    public decimal 체결수량;
    public fixed int _매수호가잔량[4 * 5];
    public fixed int _매도호가잔량[4 * 5];
}
1개의 좋아요