寻找.Net磁盘缓冲流

时间:2009-07-08 00:53:41

标签: .net

我有一个.NET 2.0 Web应用程序,它仅用作客户端应用程序的后端,该应用程序将向其发送1-500KB数据的请求,服务器将对该数据进行一些处理,然后查询一个数据库,用于构建一组数据以返回客户端 - 从200KB到200MB的数据。从数据库完全加载数据可能需要15分钟,而完全传输到客户端可能需要长达一个小时(尽管典型时间相当低 - 20秒查询,10秒传输)。但是,对于数据库查询和客户端的某些组合,有时DB更快,有时链接到客户端更快。

客户端通过不同质量的链路进行连接 - 一些通过10MB LAN连接,一些通过共享的64kbps ISDN链路连接。我有四件事我想确保:

  1. 数据库连接必须在尽可能短的时间内保持打开状态。
  2. 必须使用最小的服务器内存。
  3. 必须尽快将数据流式传输到客户端。
  4. 进程的总持续时间应尽可能接近两个进程的最大值(DB等待时间,网络传输时间),而不是两个进程的时间总和。
  5. 到目前为止,我们有三种模式可以运行代码:

    1. 从数据库中提取数据时,请将其写入响应流。
    2. 从数据库中提取数据时,请将其保存在内存中。数据库读取完成后,关闭数据库连接并将数据从内存写入响应流。
    3. 从数据库中提取数据时,请将其写入临时文件。完成对DB的读取后,关闭数据库连接并从临时文件中读取并写入响应流。
    4. 您可以想象,这些都不能完全满足我们对所有场景的要求。我们已经讨论过根据我们应该使用的三个代码路径中的一些变量实现一些代码进行猜测,但我认为这里有一个更通用的解决方案,我正在寻找一些可以解决这个问题的代码/库对我们来说。

      我正在寻找的东西是我可以包装的.NET流(输出流),我可以从我们的HttpHandler写入它,它将处理将数据写入底层流。如果底层流有太多待处理数据,它将存储在内存中,并在可能的情况下稍后发送。一旦内存缓冲区变得太大,它将作为缓冲区回退到临时文件。当我尝试关闭流时,它会阻塞,直到所有数据都写入流中。

      你知道我可以用作起点的任何代码,或者有这样的东西的库,或者我应该注意的任何指导吗?或者,我是否试图完全过度设计这个解决方案?

1 个答案:

答案 0 :(得分:2)

操作系统非常擅长在适当的时间将内存交换到磁盘。为什么不直接使用常规缓冲流并让交换空间作为文件支持,而不是猜测操作系统?