我试图从python中调用一个Java程序(斯坦福中文分词器)。Java程序需要加载一个大的(100M)字典文件(单词列表以帮助分词),这需要12秒以上的时间。我想知道是否可以加快加载过程,更重要的是,当我需要多次调用python脚本时,如何避免重复加载?在
以下是代码的相关部分:
op = subprocess.Popen(['java',
'-mx2g',
'-cp',
'seg.jar',
'edu.stanford.nlp.ie.crf.CRFClassifier',
'-sighanCorporaDict',
'data',
'-testFile',
filename,
'-inputEncoding',
'utf-8',
'-sighanPostProcessing',
'true',
'ctb',
'-loadClassifier',
**'./data/ctb.gz',**
'-serDictionary',
'./data/dict-chris6.ser.gz',
'0'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
stderr = subprocess.STDOUT,
)
在上述代码中,'./数据/广州ctb'是加载大单词列表文件的位置。我想这可能和过程有关,但我不太了解。在
您可能可以在这里使用特定于操作系统的解决方案。大多数现代操作系统都能在内存中有一个分区。例如,在Linux中
将文件移动到该目录将大大加快I/O速度
如果java程序在接收到来自^{} named pipe 的输入后立即生成输出,并且您不能更改java程序,那么您可以让Python脚本继续运行,并通过文件/套接字作为@DNA suggested for the Java process与之通信(想法相同,但Python程序一直在运行)。在
可能有许多方法可以加快单词列表的加载,但这取决于细节。如果IO(磁盘读取速度)是瓶颈,那么一个简单的方法可能是压缩文件并使用ZipInputStream来读取它,但您需要对其进行基准测试。在
为了避免多次加载,您可能需要保持Java进程运行,并通过文件或套接字从Python与它通信,以发送命令,而不是每次都从Python启动Java进程。在
但是,这两种方法都需要修改Java代码。在
相关问题 更多 >
编程相关推荐