2014-02-25 45 views
0

我写的scala应用程序使用了很多Kyotocabinet的Db文件(我需要一次打开500-3k小kyotocabinet文件)。
但512打开(创建)的数据库文件后,我有一个错误“错误:成功:没有错误”,并没有创建新的数据库文件。
谷歌搜索后,我发现在这里与东京内阁+ Java类似的问题:https://groups.google.com/forum/#!msg/tokyocabinet-users/ve6OsRm_hyU/hXC7795iqPsJ但没有解决方案。
那么交易是什么?我如何在一个应用程序中打开更多kyotocabinet文件?可能是Kyotocabinet有一些错误?Kyotocabinet和Scala(Java):数据库文件的限制是否打开?

+0

您使用的是Linux吗?你有没有尝试增加ulimit? –

+0

是的,我尝试在控制台中设置ulimit -n 8192,然后运行sbt中的测试代码,但没有任何效果...我也想到了mmap,京都人为每个打开的文件使用,尝试在打开文件时减少msiz = param,但这没有帮助 –

+0

为什么你需要多次打开数据库?只需在程序启动时打开它,并在完成时关闭它。 – SnakeDoc

回答

1

好,似乎,我发现我的问题的答案...
这不是Java或斯卡拉特定的问题,而是Kyotocabinet
首先,我尝试重现另一种语言这种行为。所以,我使用Perl所著的测试程序,它也失败,但随着更多信息的消息:pthread_key_create

之后得到的来源:
终止扔“的std :: runtime_error”
什么()的一个实例后调用kyotocabinet并研究了为每个京瓷File()对象创建的特殊TSDKey对象,并且此对象创建了pthread_key。默认情况下,一个 进程可以创建有限数量的此键,并且此数字在PTHREAD_KEYS_MAX中定义。
如此看来,在一个进程中打开超过512页分贝京都的文件是不可能的:(

0

是的,我做了一个尝试,提高宏观PTHREAD_KEYS_MAX的值会解决这个问题。

我使用Ubuntu 16.04,与libc的版本2.23。pthread是在libc中的一个插件。

  1. 下载源代码http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.bz2

  2. 修改从宏观PTHREAD_KEYS_MAX 1024到2048.不要太大。我试过10240,但测试程序崩溃。

  3. 修改系统包含文件local_lim.h中的maxcro值,并用新版本替换系统库。

  4. 重建kyotocabinet。

  5. 将libkyotocabinet.so和libpthread.so.0复制到您的测试程序路径中。

  6. 出口LD_LIBRARY_PATH =/

  7. 执行测试计划。最大数据库文件的数量增加了一倍。

相关问题