【问题标题】:Downloading a large number of small files下载大量小文件
【发布时间】:2013-01-03 14:17:15
【问题描述】:

我正在寻求改进 WCF 客户端/服务器,以便它能够处理大量小文件,比目前更快。

我编写了一个 WCF 客户端和一个服务器来跨网络移动文件。

我通过从客户端调用服务器(将我要下载的文件名作为参数发送)然后让服务器返回一个流来使其工作

简化示例:

//CLIENT CODE>>
Stream stream = syncService.GetStream(fileName);
//<<CLIENT CODE

//SERVER CODE>>
public Stream GetStream(string fileName)
{
   string filePathOnServer = ServerService.Service1.SERVER_FILES_PATH + fileName;
   return File.OpenRead(filePathOnServer);
}
//<<SERVER CODE

如果我需要获取多个文件,然后我会递归调用 GetStream,并将流保存到客户端计算机上的文件中。 它在移动少量大文件时可以接受 我遇到的问题是,下载单个文件的开销约为 1/10 秒,无论大小如何;所以如果我想下载大量 1Kb 的文件,我基本上被限制在最大 10Kbs 以内。

我希望有人对替代实施提出建议。 我尝试从服务器返回一个流列表,但我认为 WCF 不允许这样做。

我需要能够在不压缩文件的情况下执行此操作。

我正在考虑尝试返回一个由多个连接的流组成的流,但我不确定是否有更好的方法。

【问题讨论】:

  • 为什么不将文件列表作为参数传递并在单个流中返回所有文件。只需在流中为每个文件添加一个文件长度,然后解析和拆分返回的数据。
  • @Pete 感谢您的回复。这就是我目前正在考虑的,但我认为可能会有更好的选择。我将尝试编写代码,同时等待看看是否有人有其他建议。
  • 您不指定托管服务的方式,但如果托管在 IIS 中,则必须为每个 WCF 方法调用创建并打开 HTTP 连接。当您处理大量呼叫时,会有很多开销。
  • @Pete 是的,没错。我认为这是我的大部分开销所在,所以我肯定需要减少函数调用的数量。

标签: c# wcf client-server


【解决方案1】:

我会更改您的 WCF 方法以接受文件名集合(即 List&lt;string&gt; 或 string[]),然后将它们打包。我知道SharpZipLib 可以很好地生成 ZIP 文件。

您将 ZIP 文件流式传输回客户端,客户端将依次解压缩并处理文件。

一个更大的文件应该是传输速度快几个数量级并且带宽更轻(因为你会处理更少的网络相关开销),更不用说你会有一个事实单个 WCF 调用,而不是每个文件一个(一个巨大的瓶颈)。

【讨论】:

  • 感谢您的建议。除非万不得已,否则我会尽量避免压缩文件;但你是对的,这应该可以解决问题。
  • 甚至可以禁用压缩。 ZIP 只是一种容器格式。
  • @usr 同意,但这主要取决于文件是什么(TXT 文件会缩小很多,压缩程度高的 JPEG 不会那么多),因为即使“浪费”,传输速度也可能更快压缩数据需要一些时间(即压缩需要 3 秒,但流式传输较小的 zip 文件可以节省 20 秒......这是一个胜利)
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 2012-06-06
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多