有没有一种方法可以使用std :: io :: Write写入内存缓冲区而不需要重新分配?

3

有没有办法使用std::io :: Write将流直接写入内存,而不是在开始时预先分配最终内存或在写入时可能重新分配整个数组?

虽然Vec实现了Write,但这需要连续的内存,并且我认为可能会像常规向量调整大小一样重新分配。

Rust的stdlib是否支持这样的功能,还是需要实现它?


我想要写入可能达到多个GiB的内存。这个内存可能是碎片化的,也有可能没有我需要的连续区域大小。相反,分配许多块(可能是固定的2的幂次大小)并在需要时分配更多块是非常高效的。

完成后,您可以读取数据,压缩内存中的块,将一些缓存到磁盘上,与先前的写入进行二进制差异以去重块等等。


@ljedrz 据我所见,这只是一个中间缓冲区,用于包装另一个写入器(它只是在刷新之前将许多小的写入操作存储在缓冲区中,但不打算成为你写入的目标)... 除非我误解了文档。 - ideasman42
@Chris Emerson,是的,可以使用一系列较小的缓冲区,并且可能在最后合并。但不一定需要这样做。还可以对其进行其他操作(内存压缩,保持原样以供重复使用...等等)。 - ideasman42
2
ж–ҮжЎЈдёӯжІЎжңүеҲ—еҮәд»»дҪ•жҳҺжҳҫзҡ„std::io::Writeзҡ„е®һзҺ°жқҘж»Ўи¶ідҪ зҡ„йңҖжұӮпјҢжүҖд»ҘжҲ‘и®ӨдёәдҪ йңҖиҰҒиҮӘе·ұе®һзҺ°е®ғгҖӮ - Chris Emerson
1
这似乎是一个相当专门化的要求(细节可能很重要)。除此之外,实现Write特质以满足你的需求非常容易,例如使用Vec<Vec<u8>> - user4815162342
尝试使用Cursor,就像在https://dev59.com/rVgR5IYBdhLWcg3woul6#41069910中建议的那样。 - clonejo
显示剩余4条评论
1个回答

0

在Rust 1.15.1标准库中没有这样的支持。

一旦你实现了这样一个处理创建和避免任何内存碎片问题的数据结构,实现Write应该很简单。

如果你在64位机器(16艾字节)或更小的48位寻址(256太字节)上遇到内存碎片问题,我建议重新检查你的解决方案是否适合问题领域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接