Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kyotocabinet和Scala(Java):数据库文件打开的限制?_Java_Scala_Kyotocabinet - Fatal编程技术网

Kyotocabinet和Scala(Java):数据库文件打开的限制?

Kyotocabinet和Scala(Java):数据库文件打开的限制?,java,scala,kyotocabinet,Java,Scala,Kyotocabinet,我编写了使用大量Kyotocabinet Db文件的scala应用程序(我需要一次打开500-3k小Kyotocabinet文件)。 但在打开(创建)512个db文件后,我出现了一个错误“error:success:no error”,并且没有创建新的db文件。 在谷歌搜索之后,我在这里发现了东京内阁+Java的类似问题:但没有解决方案。 那怎么办?如何在一个应用程序中打开更多kyotocabinet文件?Kyotocabinet中可能有一些bug?好的,看来我找到了问题的答案… 这不是Java

我编写了使用大量Kyotocabinet Db文件的scala应用程序(我需要一次打开500-3k小Kyotocabinet文件)。
但在打开(创建)512个db文件后,我出现了一个错误“error:success:no error”,并且没有创建新的db文件。
在谷歌搜索之后,我在这里发现了东京内阁+Java的类似问题:但没有解决方案。

那怎么办?如何在一个应用程序中打开更多kyotocabinet文件?Kyotocabinet中可能有一些bug?

好的,看来我找到了问题的答案…
这不是Java或Scala特有的问题,而是Kyotocabinet
首先,我试图用另一种语言再现这种行为。所以我用Perl编写了测试程序,它也失败了,但有更多的信息:
在抛出“std::runtime_error”实例后终止调用
what():pthread\u key\u create

之后,获得了kyotocabinet的源代码,并研究了为每个kyoto File()对象创建的特殊TSDKey对象,以及该对象创建pthread_键。默认情况下为1 进程可以创建有限数量的此键,并且此数量在PTHREAD_keys_MAX中定义。

因此,似乎不可能在一个进程中打开多个数据库文件:(

是的,我尝试过。增加宏PTHREAD\u KEYS\u MAX的值将解决此问题

我使用的是Ubuntu16.04和libc版本2.23。libpthread是libc的一个附加组件

  • 从下载源代码

  • 将宏PTHREAD_KEYS_MAX从1024修改为2048。不要太大。我尝试了10240,但测试程序崩溃了

  • 修改system include文件local_lim.h中的maxcro值,并用新版本替换系统库

  • 重建京都内阁

  • 将libkyotocainet.so和libpthread.so.0复制到测试程序路径

  • 导出LD_库_路径=/

  • 执行测试程序。max db文件的数量增加了一倍


  • 您正在使用Linux吗?您是否尝试增加ulimit?是的,在sbt中运行测试代码之前,我尝试在控制台中设置ulimit-n 8192,但没有效果…我还考虑了Kyoto在每个打开的文件中使用的mmap,尝试在打开文件时减少msiz=param,但这没有帮助为什么您需要打开数据库那么多次?只需打开它w当你的程序启动时,关闭它。@SnakeDoc我不会多次尝试打开一个数据库,我需要在应用程序启动时打开多个不同的数据库文件,以后再打开。我知道这可能看起来有点奇怪,但架构的细节。我知道大多数操作系统/文件系统都会有一个最大值限制可以有多少个打开的文件句柄…听起来你可能遇到了这个问题,如果是这样,那么这将是一个设计问题。这些限制是有原因的,仅仅增加它们可能会导致系统不稳定,甚至更糟。