0

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

4

2 回答 2

1

好的,我似乎找到了我的问题的答案......
这不是 Java 或 Scala 特定的问题,而是京都内阁
首先我尝试用另一种语言重现这种行为。所以我使用 Perl 编写了测试程序,它也失败了,但有更多信息性消息:
在抛出 'std::runtime_error'
what(): pthread_key_create 的实例后调用终止

之后获得了kyotocabinet的来源并研究了为每个kyoto File()对象创建了特殊的TSDKey对象,并且该对象创建了pthread_key。默认情况下,一个进程可以创建有限数量的此密钥,并且此数量在 PTHREAD_KEYS_MAX 中定义。
所以似乎不可能在一个进程中打开超过 512 个京都数据库文件:(

于 2014-02-25T22:42:55.577 回答
0

是的,我试过了。增加宏 PTHREAD_KEYS_MAX 的值将解决问题。

我使用的是 Ubuntu 16.04,libc 版本为 2.23。libpthread 是 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. 重建京都内阁。

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

  6. 导出 LD_LIBRARY_PATH=./

  7. 执行你的测试程序。最大 db 文件的数量翻了一番。

于 2017-09-27T11:14:19.413 回答