16

DebianベースのマシンでRの並列パッケージを使用してしばらく遊んだ後でも、計算後にすべてのゾンビの子プロセスを削除する方法を見つけることができません。

一般的でOSに依存しないソリューションを探しています。

2つのコアの問題を説明する簡単なスクリプトを以下に示します。

library(parallel)
testfun <- function(){TRUE}

cltype <- ifelse(.Platform$OS.type != "windows", "FORK", "PSOCK")
cl <- makeCluster(2, type = cltype)
p <- clusterCall(cl, testfun)
stopCluster(cl)

残念ながら、このスクリプトはプロセステーブルに2つのゾンビプロセスを残しますが、これらはRがシャットダウンされた場合にのみ強制終了されます。

4

2 に答える 2

7

これは「FORK」クラスターでのみ問題になるようです。代わりに「PSOCK」クラスターを作成すると、を呼び出すときにプロセスが停止しますstopCluster(cl)

Debianベースのマシンで「PSOCK」クラスタを使用することを妨げるものはありますか?

于 2012-03-01T15:29:21.413 に答える
4

おそらくあなたの問題の答えはmakeCluster()コマンドのヘルプファイルにあります。

ファイルの下部には、次のように記述されています。stopClusterを呼び出してワーカーをシャットダウンすることをお勧めします。ただし、コマンドをリッスンしているソケットが使用できなくなると、ワーカーは自動的に終了します。セッションが完了しました(またはそのプロセスが終了しました)。

解決策は、クラスターの作成中にクラスターのポートを定義することです(私にとっては機能しています)。

cl <- makeCluster(2, type = cltype,port=yourPortNumber)

別の(役に立たないかもしれない)解決策は、ソケットのタイムアウトを設定することです。タイムアウト変数は秒単位です。

cl <- makeCluster(2, type = cltype,port=yourPortNumber,timeout=50)

いずれの場合も、目的はソケット接続を使用不可にすることです。ポートを閉じるか、メインRプロセスを閉じるとこれが行われます。

編集:私が意味したのは、プロセスがリッスンしているポートを閉じることでした。OSに依存しない必要があります。使用してみることができます-> showConnections(all = TRUE); 。これにより、すべての接続が提供されます。その後、試すことができますcloseAllConnections();

これも機能しない場合は申し訳ありません。

于 2012-02-29T14:37:30.273 に答える