2014-02-25 46 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. 執行測試計劃。最大數據庫文件的數量增加了一倍。

相關問題