gpt4 book ai didi

java - PHP调用Java过程的性能调优

转载 作者:行者123 更新时间:2023-12-01 13:10:11 25 4
gpt4 key购买 nike

我有一个 PHP Web 表单,它接受文件上传(图像和文本),并从中提取文本(OCR 和 .pdf、.doc 等剥离为纯文本)。文本提取是通过使用 exec 调用 jar 文件/命令行进程(我无法控制其中任何一个的源)来执行的,该进程返回文本。测试时没有问题,但是,同时上传 5 个 PDF(每个大约 5MB)时,服务器负载达到最大。整个过程(每次上传)需要 10-15 秒,负载立即恢复正常。

我假设问题出在 Java 和每个 exec 调用的 JRE 分配上;当从命令行手动调用 jar 文件时,大约需要 10 秒,因此几乎与单个上传响应相同。无法将提取作为后台进程运行,因为 HTTP 响应包含从上传的文件文本处理的“数据”。我考虑过 fork 该进程,但这对服务器负载没有帮助(可能会使情况变得更糟)。我希望避免完全用 Java 重写服务。

有没有办法预加载 Java 进程 JRE 或通过管道将连续文件传输到相同的文件或类似的东西?

最佳答案

当然,为每个请求启动一个 JVM 是一个非常糟糕的主意。这正是 Java 缓慢的地方。

应该很漂亮easy使用例如ServerSocket 。启动一个进程并向其发送请求。这不是最快的解决方案,但很简单,并且可以保证巨大的加速。

<小时/>

JAR 文件有时是“可执行文件”,但它始终是“库”。它实际上只是一个重命名的 ZIP 文件,因此您可以轻松查看里面的内容(我不会将其称为逆向工程)。有一个名为 list 的文件,其中包含对主类的引用。您可以编写自己的类,调用原始 main 或忽略它。

为此,您根本不需要修改原始 JAR。只需让您自己拥有即可,但您甚至不需要 JAR 文件。对于简单的事情,一个类就足够了。然后你就这样调用它

java -cp "old.jar;." YourClass

假设您使用的是 Windows(否则将 ; 替换为 :),YourClass 位于主包中(这通常是一个坏的想法,但对于单个类项目来说还可以),以及 YourClass.class (即 YourClass.java 的编译版本位于当前工作目录中。

<子>我不会寻求更快、更复杂的解决方案,例如使用 ServerSocketChannel s,因为它不值得。启动一个新的 JVM 需要时间,而且,它是从解释字节码并编译它开始的……这比一些通信开销要糟糕得多。你可以节省更多微秒......

关于java - PHP调用Java过程的性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com