【发布时间】:2019-04-11 02:19:01
【问题描述】:
我正在编写在 Windows Server 2016 上运行的 .NET 应用程序,它对一大堆大文件执行 http 获取。这大大加快了下载过程,因为您可以并行下载它们。不幸的是,一旦它们被下载,需要相当长的时间才能将它们全部重新组合在一起。
有 2-4k 个文件需要合并。这将运行的服务器有足够的内存,接近800GB。我认为使用MemoryStreams 来存储下载的片段直到它们可以顺序写入磁盘是有意义的,但是在我得到一个之前我只能消耗大约2.5GB 的内存System.OutOfMemoryException 错误。服务器有数百 GB 可用,我不知道如何使用它们。
【问题讨论】:
-
ConcatenatedStreamfrom How do I concatenate two System.Io.Stream instances into one? 可能会满足您的需求,只要您不需要随机搜索。 -
并且,请确保您已编译为 x64(或任何没有“首选 32 位标志”并在 x64 上运行的 CPU)
-
2.它是 x64,我使用 dumpbin 来验证是否支持大地址。
-
这是一个简单的程序来重现我的问题。
static void Main(string[] args) { MemoryStream ms1 = new MemoryStream((int)Math.Pow(1024, 3)); MemoryStream ms2 = new MemoryStream((int)Math.Pow(1024, 3)); MemoryStream ms3 = new MemoryStream((int)(Math.Pow(1024, 3)*.95)); MemoryStream ms4 = new MemoryStream((int)Math.Pow(1024, 3)); //this errors out with an out of memory error } -
第三个内存流很有趣。我将允许的字节总数乘以 0.95,它会起作用,如果我达到 0.96 或更高,它将不起作用。如果第三个没有,第 4 个 MemoryStream 会导致内存不足错误。
标签: c# .net windows memory 64-bit