【问题标题】:How do I optimize this export feature for LAMP web app?如何优化 LAMP Web 应用的此导出功能?
【发布时间】:2010-09-29 13:47:41
【问题描述】:

我有一个功能允许用户创建项目并在此页面上查看它。 他们可以导入资源(pdf、img 等)以与他们的项目一起保存。 所以现在我想创建一个功能,允许用户将他们所有的东西以及与他们在同一组中的人都整齐地用漂亮的丝带绑在一个 zip 文件中。

目前我正在使用 Archive:Zip 抢先压缩文件,保留他们的 CRC32 校验和并将其作为每日 cronjob 运行,以减少用户等待时间。但是,如果对任何文件有任何更改,我将不得不重新运行整个过程。

我的初始基准测试显示,103MB 的文件最多需要 47 秒才能运行。 该过程涉及生成将它们链接到 XSL 的 XML、复制图像、用于 iframe 的 html 等等。

我正在考虑创建一个表或文本文件,以将所有文件的 CRC32 校验和或上次修改日期保存在临时存储区域中,并在每次用户单击导出时与此列表进行比较,如果有的话新文件,我将从缓存的 zip 文件中删除相同的文件并添加新文件。或者我只保留所有松散的文件并复制和替换较新的文件,然后在每次点击时进行存档。

我的问题是:

  1. 这被认为是过早的还是 糟糕的优化技术?
  2. 我应该如何正确优化它?
  3. 是否有一些书籍或资源 我可以学习这些 优化技术?

【问题讨论】:

    标签: optimization caching lamp


    【解决方案1】:

    这个想法有什么问题:

    • 每当用户文件更改(添加、删除或更改文件)时设置某种标志。
    • 对每个文件已更改的用户运行夜间压缩,然后重置该标志。
    • 如果用户在设置标志时请求导出,则必须在导出完成之前再次进行压缩(没有办法解决)。

    为了进一步加快用户体验,您还可以将导出请求与导出操作分离。例如,当用户(其标志已设置)请求导出时,通知他们将在压缩发生时完成,并设置不同的标志。然后修改上面的第二步,如果设置了第二个标志,也可以导出新创建的包。

    这会立即向用户提供即将发生的事情的反馈,但会将繁重的工作转移到未来。

    或者,您不必将导出绑定到压缩。您可以每天晚上压缩,但根据需要在白天允许额外的压缩/导出作业。但是,将请求与事件分离仍然很好。

    回答您的具体问题。

    1/ 我不认为这种过早或糟糕的优化。 “代码”在功能上是完整的,因为它可以满足您的所有要求,因此是优化的最佳时机。此外,您已经确定了瓶颈并正在优化正确的区域。

    2/ 见我上面的文字。您应该通过完全按照您所做的来优化它 - 确定瓶颈并专注于改进它。鉴于您不太可能获得更好的压缩性能,我建议的解耦“技巧”是一个很好的方法。与进度条和闪屏一样,它通常更多地与用户对速度的感知有关,而不是速度本身。

    3/ 书籍?不要打扰,网上有成千上万的资源。继续询问 SO 并打印出所有回复。最终你的大脑会和我一样充实,每一个新的 sn-p 代码都会让你暂时忘记你妻子的名字:-)。​​

    【讨论】:

    • 呵呵,有趣且有用的+1,好的,因为我正在寻找更多方法来解决这个问题。不过,能够在此类问题上找到更多“模式”将是一种有趣而有趣的学习体验。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多