web-dev-qa-db-ja.com

エラー:DLLの最大数に達しました

私は他の多くのパッケージに依存するRパッケージを書いています。セッションにあまりにも多くのパッケージをロードすると、次のエラーが頻繁に発生します。

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/proxy/libs/proxy.so':
  `maximal number of DLLs reached...

この投稿 RのDLLの最大数を超えました 問題はベースRコードのRdynload.cにあることを指摘しました:#define MAX_NUM_DLLS 100

ソースから変更およびビルドする以外に、この問題を回避する方法はありますか?

23
Qin Zhu

もちろん、その数を増やすことは「可能」です...しかし、少しコストがかかります(Rの固定メモリフットプリントに追加されます)。

私はその制限を設定しませんでしたが、useRが彼女/彼のRセッションで少し「クリーンアップ」すること、つまり、パッケージの名前空間を不必要にロードしないことを思い出させることも意味していたと確信しています。 100個以上のパッケージが必要だとはまだ想像できません。 Rセッションにロードされた名前空間。 OTOH、いくつかのパッケージは現在、依存関係のホストを持っているので、これは少なくとも過去よりも偶然に頻繁に起こる可能性があることに同意します。

もちろん、実際の解決策は、比較的少数の "DLLinfo"構造(たとえば32)で始まり、必要に応じて(たとえば32の)バッチをさらに割り当てるコードの改善です。

Rソースへのパッチ(Subversionの開発トランク https://svn.r-project.org/R/trunk/ )は大歓迎です!

---- 2017年1月26日追加:とりあえず、これについて 公開バグ報告 がありました。これは提案されたパッチです(十分ではありません:常にOSに依存しています開いているファイルの数の制限)、そしてそのバグレポートは、ロードされたDLLの最大数がに設定されている新しいコードを実装したRコアメンバー@TomasKaliberaによってクローズされました

pmax(100, pmin(1000, 0.6* OS_dependent_getrlimit_or_equivalent()))

windowsおよびLinux(まだテストされていないが、「ほぼ確実に」macOS)では、制限は以前よりもかなり高くなるはずです。

-----アップデート#2(2018年1月5日作成):
10月'17に、ソースへの次のコミットにより、上記の変更がより自動化されました(Rの開発バージョンのみ-)。

r73545 |カリベラ| 2017-10-12 14:41:20

デフォルトでロードできるDLLの数を増やします。必要に応じて、開いているファイルのソフト制限を増やします。

およびヘルプページ?dyn.loadhttps://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.htmlulimit -n <num_open_files>が言及されました(セクション下部近く)。

4月に「メインストリーム」になるまで、Rの開発バージョンを使用することを検討してください。
代わりに、あなたは(ターミナル/シェルで)

ulimit -n 2048

そして、その端末からRを起動します。 Tomas Kaliberaさんは、macOSで動作するようにこれについて言及しました。

16
Martin Mächler

R 3.4では、環境変数R_MAX_NUM_DLLSを使用して、異なるDLLの最大数を設定できます。リリースノートから:

RにロードできるDLLの最大数。 via dyn.load()は、Rを起動する前に環境変数R_MAX_NUM_DLLSを設定することで増加できるようになりました。

19

生体伝導体のsimpleSingleCellライブラリでこの問題が発生しました

MacOSでは、256を超えることはできません。したがって、ホームディレクトリに.Renvironを設定しますR_MAX_NUM_DLLS = 150

5
steve