0

Floyd-Warshall アルゴリズムに 3 次元配列を使用しています。しかし、問題は、100 を超えるサイズを使用しているときに、メモリが不足していることです。

float[100][100][100] array= new float[100][100][100];

そこで代替案を考えていました。1 つは、2 次元のFloatを使用して、それらを ArrayList に格納することでした。しかし、0 ではなく null である Float の初期化で問題が発生したため、結果が false になるため、まったく機能しません。並列処理にも最適なので、コードを再度変更したくありません。別のデータ構造を使用して値を格納する可能性はありますか?

4

4 に答える 4

3

サイズ 100 の 3D キューブ内の 4 バイトの float は、少なくとも 4,000,000 バイトを使用します。それはかなり大きな塊です。

それらすべてを同時にメモリ内に置くと、使用するデータ構造に関係なく、少なくともそれだけのスペースを占有します。

それらをメモリから移動し、必要な場合にのみ取り込むことを検討してください。

それを行う最善の方法は、それらに対して行う必要がある処理の種類によって異なります。たとえば、次の疑似コードを使用して直接順次処理を行っていたとします。

for i = 0 to 99:
    for j = 0 to 99:
        for k = 0 to 99:
            loadAndDoSomethingWith (i, j, k)
flushData()

currentlyLoaded = -1
float buffer[100]

def loadAndDoSomethingWith (i, j, k):
    if i * 100 + j != currentlyLoaded:
        flushData()
        currentlyLoaded = i * 100 + j
        read buffer from file #currentlyLoaded
    doSomethingWith (buffer, k)

def flushData():
    if currentlyLoaded != -1:
        write buffer to file #currentlyLoaded

その後、一度に 1 つの次元 (100 個の浮動小数点数) を取り込むことができます。

データ構造内のさらに多くの場所からのデータが必要な場合など、より複雑なケースを処理するために、複数のバッファーを使用して同様のスキームを実行できます。スラッシングをできるだけ回避するために、バッファリング戦略をアルゴリズムに一致させるようにしてください。

于 2013-09-11T07:34:48.900 に答える
3

配列はオブジェクトであるため、ラッパー型の使用に限定されません。の配列リストを作成できますfloat[][]

いずれにせよ、100x100x100 = 1000 000 のフロートには約 4 MB のメモリが必要です。何でもないわけではありませんが、不当に大量のメモリを使用しているようには見えません。問題が別の場所にあると確信していますか? 不要になったオブジェクトを保持していて、ガベージコレクションされる可能性はありますか?

于 2013-09-11T07:35:10.070 に答える
0

IMHO 100x100x100 のフロートが必要な場合、それについてできることはあまりありません。フロート オブジェクトはプリミティブ フロートより多くのメモリを必要とするため、フロート オブジェクトを使用してメモリ消費を削減しても意味がありません。できることは 2 つだけです。
1. 使用する数値が少なくなるようにアルゴリズムを変更/最適化します。
2. AndroidManifest で以下を使用します。

<application
    android:name="com.myApp"
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
   android:largeHeap="true"

使用するヒープのサイズを増やすことができます。
ちょうど私の 2 ペニー。

于 2013-09-11T07:35:20.307 に答える
-1

JVM から4byte*100*100*100 ~ 2MB の連続したメモリを割り当てようとしていますが、これは非常に巨大です。代わりに、3 つの float 属性を持つオブジェクトを作成してみてください。任意の値で属性を初期化できます。

class Node{
private float u =0;
private float v =0;
private float l =0;
}
于 2013-09-11T07:39:06.673 に答える