|
|
1
35
我希望这没问题。这是我对stackoverflow的第一个回答。 是的,如果chunkSize超过85000字节,那么数组将被分配到大对象堆上。在分配和解除分配相同大小的连续内存区域时,可能不会很快耗尽内存,因此当内存充满时,运行时可以将新块放入旧的回收内存区域。 我会有点担心数组。调整调用的大小,因为这样会创建另一个数组(请参见 http://msdn.microsoft.com/en-us/library/1ffy6686(VS.80).aspx )如果actuallength==chunksize,这是一个不必要的步骤,因为它只适用于最后一个块。所以我至少建议:
这将删除大量的分配。如果actualsize与chunksize不同,但仍为>85000,则新数组也将分配到大型对象堆上,这可能导致该对象堆碎片化,并可能导致明显的内存泄漏。我相信,实际耗尽内存还需要很长时间,因为泄漏会很慢。 我认为更好的实现应该是使用某种缓冲池来提供数组。你可以自己滚(这太复杂了),但WCF确实为你提供了一个。我已经稍微重写了您的代码,以便对其进行宣传:
这假设可以重写uploadFile的实现,以获取要写入的字节数的int。 我希望这有帮助 乔 |
|
|
2
5
也见 RecyclableMemoryStream . 从 this article : Microsoft.IO.RecyclableMemoryStream 是一个内存流替换,为性能关键的系统提供卓越的行为。特别是,优化后可执行以下操作:
|
|
|
3
2
我不太确定你问题的第一部分,但为了更好的方式,你考虑过了吗? BITS ?它允许通过HTTP后台下载文件。您可以为它提供http://或file://uri。使用HTTP头中的range方法,可以从中断点恢复到以字节为单位下载。它由Windows Update使用。您可以订阅提供进度和完成信息的事件。 |
|
|
4
1
我想出了另一个解决办法,让我知道你的想法! 因为我不想在内存中存储大量数据,所以我正在寻找一种优雅的方法来临时存储字节数组或流。 其思想是创建一个临时文件(您不需要特定的权限来执行此操作),然后使用它类似于内存流。将类设为一次性将在使用后清理临时文件。
…
|