2015-08-08 107 views
0

当我尝试使用NamedPipeServerStream类对象通过调用其Write()方法来传输1GB数据时会发生什么?特别是如果数据不是立即被客户使用的话。数据在哪里?管道传输大数据

什么是使用管道传输大量数据的好技术?将它分成更小的块并实现一些通信协议?

是否有更好的替代管道?我想避免写入硬盘。

+0

你为什么不尝试一下,找出答案?我个人的猜测是,对管道的大量写入会很快挂起,等待读者在另一端使用数据。所以在这个意义上,管道给你一个自动协议。 –

+0

例如,客户端将尝试读取较小的数据块(比如1K),这将需要一些时间,而数据一次写入,并且所有数据必须到某处。可能还有其他我现在无法想到的场景。 – mcu

+0

所以你说1GB的数据没有问题,只要客户一次读完所有数据? – mcu

回答

1

您可以使用内存映射文件来处理这些事情。他们对IPC工作非常好。请参阅here

我假设你的进程在同一台机器内通信。

编辑:或者你可以去插座。

编辑:我有一些使用命名管道的实现,并不是很稳定,所以我放弃了它,切换到内存映射文件。如果你仍然希望坚持使用命名管道,你可以将你的负载分成块,这些块可以由一个标题加上一些相关信息(如块大小,块索引,总块数等等),然后期待在写下一个块之前由客户确认。

+0

内存映射文件听起来不错,但内存占用量很大。我不知道在传输1GB数据时管道实际使用了多少内存。 – mcu

+0

但是,再次,将数据保存在本地字节数组中将占用两倍的内存空间 - 一次在服务器端,一次在客户端。所以我认为内存映射文件可能是一个很好的答案,只要服务器和客户端在同一台机器上。 – mcu

+0

关于内存占用情况,请记住,Windows页面文件也存在,这对任何现代PC上的一些额外的演出都有帮助。 –