代码之家  ›  专栏  ›  技术社区  ›  Jonathan Rupp

正在查找.Net磁盘缓冲流

  •  3
  • Jonathan Rupp  · 技术社区  · 16 年前

    我有一个.NET2.0Web应用程序,它只用作客户端应用程序的后端,客户端应用程序将向它发送一个包含1-500KB数据的请求,服务器将对该数据进行一些处理,然后查询一个数据库以生成一组数据以返回客户端,数据大小从200KB到200MB不等。从数据库中完全加载数据可能需要15分钟,完全传输到客户机可能需要1小时(尽管典型的时间要低得多——20秒查询,10秒传输)。但是,对于数据库查询和客户机的某些组合,有时数据库更快,有时到客户机的链接更快。

    客户机通过不同质量的链路进行连接——有的通过10MB局域网,有的通过共享的64kbps ISDN链路。我有四件事要确保:

    1. 数据库连接必须在尽可能短的时间内保持打开状态。
    2. 必须使用最少的服务器内存。
    3. 数据必须尽快传输到客户端。

    到目前为止,我们有三种模式可以运行代码:

    1. 从数据库中获取数据时,将其写入响应流。
    2. 从数据库中获取数据时,将其写入临时文件。从数据库读取完成后,关闭数据库连接并从临时文件读取并写入响应流。

    正如您所想象的,这些都不能完全满足我们对所有场景的需求。我们已经讨论过实现一些代码来根据一些变量猜测我们应该使用的三个代码路径中的哪一个,但是我认为这里有一个更通用的解决方案,我正在寻找一些代码/库来解决这个问题。

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

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   Jeremy Stein    16 年前

    操作系统非常擅长在正确的时间将内存交换到磁盘。与其猜测操作系统,不如直接使用一个常规的缓冲流,让交换空间作为文件的备份?