3

我有一个带有 API 的 servlet,它可以从 GET 请求中传递图像。servlet 根据 GET 请求的参数创建 CAD 命令的数据文件。然后将该数据文件传送到图像解析器,该解析器在文件系统上创建图像。servlet 读取图像并在响应中返回字节。

所有的 IO 和图像解析程序的调用都非常繁重,大约 80kb 的图像在本地系统上的渲染时间为 3-4000 毫秒。

大约有 20 个参数构成 GET 请求。每个都与图像的不同部分相关。因此,可能的图像组合非常大。

为了减少加载时间,我计划将渲染图像的 BLOB 存储在数据库中。如果 GET 请求与之前执行的请求匹配,我将从缓存中提取。否则,我将渲染一个新的。这不会修复“第一次”运行,但会帮助“n+1 次运行”。

关于如何提高性能的任何其他想法?

4

2 回答 2

2

您可以将文件存储在磁盘上,并将图像路径存储在数据库中,因为数据库存储通常比文件系统存储更昂贵。

对 http get 参数进行排序并将它们作为索引到该图像记录的哈希值,以便按参数快速查询。

为了确保您的程序在磁盘容量不足时不会崩溃,您应该删除未使用或很少使用的记录:

为每条记录存储一个 lastAccessedTime,每次请求图像时更新。

使用调度程序检查 lastAccessedTime,删除低于指定权重的记录。您可以使用不同的策略来计算权重,例如 lastAccessedTime、accessedCount、image size 等。

于 2012-12-17T05:01:19.803 回答
1

您可以以可预测的方式将输入渲染管道的所有参数转换为单个字符串,这样您就可以计算输入的 SHA1 哈希,然后将输出文件存储在以 SHA1 作为文件名的目录中,这样如果您收到具有相同参数的请求,您只需计算哈希然后检查文件是否在磁盘上,如果它返回则将工作发送到渲染管道并创建文件。

如果你有很多文件,你可能想要使用多个目录,也许看看 git 如何通过 SHA1 的前几个字符在目录中划分文件以获得灵感。

我在我的应用程序上使用了类似的设置我不只是存储文件进行渲染,文件存储在数据库中,但出于性能原因,我使用文件内容的 sha1 哈希作为文件的文件名 / URI 从磁盘提供它们.

于 2012-12-17T05:21:25.097 回答