6

在我的 Azure 角色中,我想在 64 位进程中运行 C# 代码,我想下载一个 ZIP 文件并尽快解压缩它。我想我可以执行以下操作:创建一个MemoryStream实例,下载到该实例,MemoryStream然后将流传递到某个 ZIP 处理库进行解包,一旦解包完成,丢弃流。这样我就可以摆脱不必要地执行大量 I/O 的写-读-写序列。

但是我读过它MemoryStream是由一个数组支持的,半 GB 的数组肯定会被认为是一个“大对象”,并将分配在一个不会在垃圾收集上压缩的大对象堆中。这让我担心,也许这种使用MemoryStream会导致进程内存碎片化和负面的长期影响。

这可能会对我的流程产生任何长期的负面影响吗?

4

1 回答 1

1

答案在您链接到的问题的已接受答案中。感谢提供参考。

真正的问题是假设应该允许程序随时消耗所有虚拟内存。仅通过在 64 位操作系统上运行代码即可完全消失的问题。

我会说,如果这是一个 64 位进程,您无需担心。

创建的空洞只会导致 LOH 的虚拟地址空间产生碎片。这里的碎片化对你来说不是什么大问题。在 64 位进程中,由于碎片而浪费的任何整个页面都将变得未使用,并且它们被映射到的物理内存再次变得可用于映射新页面。很少有部分页面会被浪费,因为这些分配很大。并且引用的局部性(碎片整理的另一个优点)大部分都被保留了,同样因为这些是大分配。

于 2012-08-09T11:35:23.663 回答