我可以在 F# 中对数组执行相当于 C 转换的操作吗?
can I do the equivalent of a C cast on an array in F#?
我有大量这种类型的数组:
type TradeData =
{
Timestamp: DateTime
Instrument: Instrument
Price: decimal
Quantity: decimal
Direction: Direction
}
我们说的是在调试期间每次加载几千兆字节。
使用 FSPickler 将数据以二进制形式存储在磁盘上,这比 Json 快得多,但仍然需要很长时间才能加载。
我通过将文件分成 1 小时的块并并行加载它们来加快速度,但是在每个调试会话开始时我们仍然需要 15-20 秒。
我想知道的是我是否可以将数据放在一个数组中,将数组写成二进制 blob。
然后我会加载 blob 并执行类似的操作:
myData = (TradeData *) pBinaryBlob
我不确定这在 dotnet 下是否可行,或者每个对象是否真的需要独立初始化。
如果您使用 struct
而不是对象,这可能可以完成。如果您已经将文件序列化为对象,您可能需要使用结构将文件 re-serialise 一次 bit-align 或使用必要的字节对齐 carefully annotate your struct。
如果您将 FileStream
读入字节缓冲区,我会考虑使用 nativeptr<'T> or (ReadOnly)Span<'T>
and MemoryMarshal.Cast
来执行 unsafe
转换。
我有大量这种类型的数组:
type TradeData =
{
Timestamp: DateTime
Instrument: Instrument
Price: decimal
Quantity: decimal
Direction: Direction
}
我们说的是在调试期间每次加载几千兆字节。 使用 FSPickler 将数据以二进制形式存储在磁盘上,这比 Json 快得多,但仍然需要很长时间才能加载。 我通过将文件分成 1 小时的块并并行加载它们来加快速度,但是在每个调试会话开始时我们仍然需要 15-20 秒。
我想知道的是我是否可以将数据放在一个数组中,将数组写成二进制 blob。 然后我会加载 blob 并执行类似的操作:
myData = (TradeData *) pBinaryBlob
我不确定这在 dotnet 下是否可行,或者每个对象是否真的需要独立初始化。
如果您使用 struct
而不是对象,这可能可以完成。如果您已经将文件序列化为对象,您可能需要使用结构将文件 re-serialise 一次 bit-align 或使用必要的字节对齐 carefully annotate your struct。
如果您将 FileStream
读入字节缓冲区,我会考虑使用 nativeptr<'T> or (ReadOnly)Span<'T>
and MemoryMarshal.Cast
来执行 unsafe
转换。