조금 더 다른 접근을 해봤습니다. 만약, 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];
}