首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免重复加载大文件?

如何避免重复加载大文件?
EN

Stack Overflow用户
提问于 2012-01-28 07:55:02
回答 5查看 662关注 0票数 4

我正在尝试从python中调用一个Java程序(斯坦福中文分词程序)。Java程序需要加载一个大的(100M)字典文件(帮助分词的单词列表),这需要12+秒。我想知道是否有可能加快加载过程,更重要的是,当我需要多次调用python脚本时,如何避免重复加载它?

以下是代码的相关部分:

代码语言:javascript
复制
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,
                       )

在上面的代码中,'./data/ctb.gz‘是加载大型单词列表文件的位置。我认为这可能与流程有关,但我对此了解不多。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-28 18:29:32

如果java程序在接收到来自filename named pipe的输入后立即产生输出,并且您不能更改java程序,那么您可以保持Python脚本运行,并作为@DNA suggested for the Java process通过文件/套接字与其通信(想法相同,但是Python程序将继续运行)。

代码语言:javascript
复制
# ...
os.mkfifo(filename)

p = Popen([..., filename, ...], stdout=PIPE)
with open(filename, 'w') as f:
     while True:
         indata = read_input() # read text to segment from files/sockets, etc
         f.write(indata)
         # read response from java process
         outdata = p.stdout.readline()# you need to figure out when to stop reading
         write_output(outdata) # write response via files/sockets, etc
票数 0
EN

Stack Overflow用户

发布于 2012-01-28 09:35:32

您可以在此处使用特定于操作系统的解决方案。大多数现代操作系统都有在内存中设置分区的能力。例如,在Linux中,您可以这样做

代码语言:javascript
复制
 mkfs -q /dev/ram1 8192
 mkdir -p /ramcache
 mount /dev/ram1 /ramcache

将文件移动到该目录将大大提高I/O速度

票数 2
EN

Stack Overflow用户

发布于 2012-01-28 07:58:51

可能有很多方法可以加快单词列表的加载速度,但这取决于细节。如果IO (磁盘读取速度)是瓶颈,那么一种简单的方法可能是压缩文件并使用ZipInputStream读取它-但您需要对此进行基准测试。

为了避免多次加载,您可能需要保持Java进程运行,并通过文件或套接字从Python与其通信,以便向其发送命令,而不是每次都从Python启动Java进程。

但是,这两种方法都需要修改Java代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9041647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档