我有写在其处理发送给它的POST数据C#TCP服务器。目前,除非大量数据的(即大于1GB)被发送到它工作正常然后它运行的内存(I它全部存储在存储器中作为一个字节数组(用List DTO)的中介)。对于大文件现在我流下来到磁盘,然后从磁盘进行流式传输的意图通过周围的文件名。

目前我所有的程序都写期待字节数组其中,在事后看来,是有点短视。如果我只是转换了ByteArray的一个MemoryStream将是双倍的内存使用情况如何?我想重新写我的代码,在一个MemoryStream工作将允许当我从磁盘读取流我重新使用它?

很抱歉的愚蠢的问题,我从来不知道什么时候C#取数据的副本,或者当它需要一个参考。

有帮助吗?

解决方案

如果你传递一个byte[]MemoryStream,则最初将复制的数据(在构造),但只要松开byte[]它可以是垃圾收集。固有地不存在“倍增”(尤其是如果可以正确地设置大小与启动,并直接写Stream而非byte[])。

我会完全说开关Stream(但的使用Stream在API - 没有什么具体MOER;你消耗的代码并不需要知道哪些类型)。最重要的是,你可以选择使用NetworkStreamFileStream如果你想在进程缓冲(直接从套接字读取)(如果你想中buffer to disk),或MemoryStream。您还需要确保你读通过基于流的编码数据的量。迭代器块(yield return)可以是非常有益这里,作为可在LINQ Enumerable方法(除了OrderByGroupBy等,这些缓冲液)。

既不传递byte[]也不传递Stream导致什么被复制,因为它们引用类型 - 复制的唯一事情是基准(4或8个字节,取决于的x86 / 64)

其他提示

一个的MemoryStream只是围绕一个字节数组流封包,这样就不会被通过使用它获得任何东西。

您需要做的(至少大文件)什么是打开FileStream和转储在您的数据。在一个较低的水平,你必须从你的连接读取X字节,然后写立即向你的文件流。这样,你就不会在一个完整的演出到内存中,但只有几个字节在同一时间内拉动。

这是否将是很容易做到取决于您的TCP服务器是如何编码的。

因为一个字节是值类型,如果你把它传递给一个功能,而不你会被处理,每次用复印ref关键字。如果与ref关键字通过它,它会采取原来的字节数组的引用。

一个MemoryStream是引用类型,所以它不会复制数据,但你传递周围参考该数据,所以你的内存使用量不会在使用一倍。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top