【问题标题】:What is the best way to handle time consuming dynamic generated reports downloads?处理耗时的动态生成报告下载的最佳方法是什么?
【发布时间】:2013-09-07 05:48:24
【问题描述】:

网站提供不断更新的内容(想想证券交易所),需要生成按需报告,并且文件会被用户下载。用户可以根据大量参数自定义下载的报告。

将高度自定义的报告下载文件处理为 (.xls) 的最佳做法是什么? 如何缓存和提高性能?

值得一提的是,数据存储在 RavenDb 中,并且报告预计可以处理 100K 大小的结果。

【问题讨论】:

    标签: asp.net performance design-patterns ravendb


    【解决方案1】:

    这里有一些提示:

    • 确保在 RavenDB 中定义了静态索引以匹配所有可能的报告。您不想为此使用动态生成的临时索引。

    • 可能一个或多个参数会极大地改变查询,因此您可能需要一些条件逻辑来选择运行几个查询中的哪一个。对于不同的分组尤其如此,因为它们需要不同的 map-reduce 索引。

    • 选择是否要使用带有SkipTake 运算符的标准分页来限制结果集,或者是否要流式传输unbounded result sets

    • 无论您如何构建实际报告,都应在内存中进行。不要尝试先将其写入磁盘。管理文件权限、锁定和清理不值得麻烦。此外,如果磁盘空间不足,您可能会导致服务器停机。

    • 最好您应该在一个步骤中构建响应并将其流式传输给您的用户,这样就不需要服务器上的大量内存。确保您了解 C# 中的 yield 关键字,并且尽可能直接使用 IEnumerableIQueryable。不要尝试使用.ToList().ToArray(),这会将整个结果集放入内存中。

    • 关于缓存,您可以考虑使用像Memcached 这样的前端缓存,但我不确定它是否对您有帮助。您可能希望数据库中的数据尽可能准确。引入任何类型的缓存都需要您了解如何以及何时重置该缓存。请记住,Raven 已经内置了多个缓存层。首先构建没有缓存的解决方案,然后在需要时添加缓存。

    【讨论】:

    • 嗨,马特,我正在使用带有转换器的流式 API。我正在经历的性能是大约 35K 文档在大约 40 秒内.. 大约 1K/秒。这些数字正常吗?
    • 很难说。有很多事情会影响性能。如果您在性能调优方面需要帮助,您可以在RavenDB Google Group 中询问,或使用a support incident
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2010-09-06
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多