我有一个PHP表单,它接受文件上传(图像和文本),从中提取文本(OCR和.pdf、.doc等)。文本提取是通过使用exec来调用jar文件/命令行进程来执行的(我不控制源),后者返回文本。虽然测试没有问题,但是,与5同时PDF上传(每个大约5MB)服务器负载最大。整个过程(每次上传)需要10-15秒,加载后立即下降到正常状态。
我假设问题在于Java并为每个exec调用分配给JRE;当从命令行手动调用jar文件时,大约需要10秒,因此几乎与单个上传响应相同。不可能将提取作为后台进程运行,因为HTTP响应包含从上传的文件文本中处理的“数据”。我考虑过分叉处理进程,但这无助于服务器负载(可能会使情况变得更糟)。我希望避免完全用Java重写服务。
有没有一种方法可以将Java进程JRE或管道连续文件预加载到相同的文件,或者类似的东西?
发布于 2014-04-08 15:24:36
如果我是您,我将首先寻找一些关于在PHP中转换文件的开源项目。当使用一种语言时,添加另一种语言通常会导致不必要的工作。很有可能,您需要的任何东西都有一个库;它甚至可能比当前的解决方案更快。
考虑到您必须使用Java:
文件操作通常占用cpu,而且只会随着较大的文件而变得更糟。除了可能限制文件大小之外,处理一个文件所需的时间很可能没有什么可做的。
然而,,,您可以控制服务器是什么/不正在做什么。您应该考虑将工作分散在服务器之间。您用来转换文件的服务器应该有一个更大的处理器,不应该需要大量的RAM;而您的web服务器在RAM上有一个更小的处理器。
对于每个转换的数据,将其存储在数据库中,直到转换完成为止。转换完成后,让您的转换服务器连接到数据库并存储相关数据,以及一个“完成”标志。
从这里开始,您可以告诉客户机/浏览器反复检查数据库中的done标志(AJAX或Page )。
干杯!
-Nick
*编辑*
此外,您的转换服务器不应该需要停止。将其作为一个非超时应用程序运行,不断检查数据库中的新作业是理想的;尽管它还建议您将其配置为在缓慢期间关闭或hibernate。
https://stackoverflow.com/questions/22940814
复制相似问题