我们使用WCF将数据从服务器应用程序传输到多个客户端。实际上,对于大多数通信量,客户机和服务器都运行在同一台机器上,所以我希望传输速度非常快。
然而,当传输大数组(16位灰度图像)时,需要几秒钟才能传输数据。对于一个16 MB的图像,它需要大约3-5秒!
最初,我们使用ushort数组,因为它是最适合存储16位灰度图像数据的数据类型。然而,这是非常慢的:大约20-25秒,16 MB。在使用byte序列化之前,当我们将数据复制到Buffer.BlockCopy数组时,由于某种原因,数据将减少到3-5秒。但是,从一个应用程序传输16 MB到运行在同一台机器上的另一个应用程序的3-5秒对我来说仍然太长了!
因此,我的问题是:如何提高这种场景的性能?
我已经调查过Marc Gravell的protobuf-net,但是我不确定它在这个案例中是否会有帮助.有什么经验或其他建议吗?
下面是我们的一个数据类的源代码(包含图像数据):
[DataContract(IsReference = true)]
public class ImageData
{
private ushort[] m_pixelData;
public ushort[] PixelData
{
get
{
return m_pixelData;
}
set
{
m_pixelData = value;
OnPropertyChanged("PixelData");
}
}
[DataMember]
public override byte[] FileData
{
get
{
if (this.PixelData == null)
{
return null;
}
return ListHelper.ConvertToByteArray(this.PixelData);
}
set
{
if (value == null)
{
this.PixelData = null;
return;
}
this.PixelData = ListHelper.ConvertToUshortArray(value);
}
}
}注意,只有FileData属性被标记为[DataMember],因此PixelData属性不会被序列化!
以下是服务器的app.config的相关部分
<system.serviceModel>
<services>
<service name="Services.ImageDataService" behaviorConfiguration="ServicesBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8008/ImageDataService" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBindingLargeFileTransfer" contract="Services.IImageDataService" />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServicesBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding
name="NetTcpBindingLargeFileTransfer"
openTimeout="00:01:00" closeTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="infinite"
transactionFlow="false" transactionProtocol="OleTransactions"
transferMode="Buffered" hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="2097152" maxBufferSize="1073741824" maxConnections="10" maxReceivedMessageSize="1073741824">
<readerQuotas
maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="infinite" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>和客户的app.config
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding
name="NetTcpBindingLargeFileTransfer"
openTimeout="00:01:00" closeTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="00:10:00"
transactionFlow="false" transactionProtocol="OleTransactions"
transferMode="Buffered" hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="2097152" maxBufferSize="1073741824" maxConnections="10" maxReceivedMessageSize="1073741824">
<readerQuotas
maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="infinite" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint
address="net.tcp://localhost:8008/ImageDataService"
binding="netTcpBinding"
bindingConfiguration="NetTcpBindingLargeFileTransfer"
contract="Services.IImageDataService"
name="Services.IImageDataService"
behaviorConfiguration="ServicesBehavior" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="ServicesBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"></dataContractSerializer>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>发布于 2013-01-02 14:02:30
在同一台机器上尝试命名管道。
选择运输
发布于 2013-01-02 16:02:57
尝试使用命名管道传输流。有关详细信息,请参阅此帖子大数据量和流
在将数据发送到服务器/客户端之前,缓冲数据可能是一个问题。流将以块的形式发送数据。
https://stackoverflow.com/questions/14123365
复制相似问题