-2

これは宿題ではなく、私の側の単なる学習演習です。私はRで非常に単純なシミュレーション(または数値クランク)を実行しています。これは2つの数値(A、B)を生成し、1か月間実行されます。

A=NULL
B=NULL
x=NULL
x <- Sys.time()
duration <-  2592000 # 30 days
while(Sys.time() <= x + duration){
A <-append(A, sample(1:5, 1000, 1/5))
B <-append(B, sample(1:5, 1000, 1/5))
save.image()
}

順調に進んでいると思いましたが、1週間後(そして数百万の数値が生成された後)、OSはプロセスを強制終了しました。OSがシミュレーションを強制終了するのを防ぐ、シミュレーションを作成または実行するためのより良い方法はありますか?

OSを適応させるよりもシミュレーションを書き直したい(スワップの追加など)。低電力デバイス(Raspberry Pi)でシミュレーションを実行していますが、ハードウェア側で実行できることには制限があります。ありがとう。

更新:
1)サンプルが一度に1000回生成されることは重要ではありません。これは私の応急修理でした。
2)シミュレーションは、設定された期間、つまり1週間、1か月、または1年間実行することが重要です。
3)不可能でない限り、生データが必要です。

4

2 に答える 2

1

2 つの大きなサンプルを作成することが目的の場合は、次の点を考慮してください。

N <- 2000000
A <- sample(1:5, N, 1/5)
B <- sample(1:5, N, 1/5)
save.image()

A と B のサンプルを一度に 1000 個ずつ交互に作成することが重要な場合は、次のことを考慮してください。

N <- 2000
n <- 1000
A.list <- vector("list", N)
B.list <- vector("list", N)
for (i in 1:N) {
   A.list[[i]] <- sample(1:5, n, 1/5) 
   B.list[[i]] <- sample(1:5, n, 1/5)
}
A <- unlist(A.list)
B <- unlist(B.list)
save.image()

これにより、コード内の 2 つの主な問題が解決されます。

  • ループ内で使用するたびにappend、R はいくつかの新しいオブジェクトを最初から作成して埋める必要があります。オブジェクトが大きくなるにつれて、ループの反復はますます遅くなります。計算時間は二次的に増加すると思います。また、メモリ空間を断片化するリスクもあります。これは説明が難しいですが、調査を試みることはできます。リストを使用することにより、各反復からの新しいデータのみをメモリに格納する必要があり、ループごとの計算時間は変わりません。
  • save.image() をループの外に移動しました。同じ考えで、オブジェクトが大きくなるにつれてオブジェクトを保存すると、ますます時間がかかります。つまり、反復が遅くなります。最終的なベクトルのみを気にするので、完了したときにのみ保存するのが理にかなっています。

の値をNいじって、OS がどこまで許容できるかを確認できます。利点は、制限が何であるかを知るために 1 週​​間または 1 か月待つ必要がないことです。

于 2012-07-09T11:03:38.883 に答える
1

結果を紙に印刷することを許容できる解決策と考える場合、データをテキストファイルまたはデータベースに追加するRoman Luštrikの解決策(質問へのコメント)は間違いなく1つの良い解決策です。

テキストファイルへの追加は次のようになります。

x <- Sys.time()
duration <-  2592000
while(Sys.time() <= x + duration){
    write.table(sample(1:5, 1000, 1/5),file="A.txt",append=TRUE,row.names=FALSE,col.names=FALSE,sep="\t")
    write.table(sample(1:5, 1000, 1/5),file="B.txt",append=TRUE,row.names=FALSE,col.names=FALSE,sep="\t")
}
于 2012-07-09T15:00:24.883 に答える