0

私は大学のオープン ソースの大規模な構成管理システムのごく一部のリファクタリングに取り組んでいます。

Weka などの機械学習用のオープン ソース ツールを使用しています。リファクタリングに割り当てられた側面は、データ マイニングとルールの構築を処理することです。

リバプールと日本で使用しているオープン ソース ファイルはうまく機能していますが、大規模なプロジェクトでプログラムを使用すると、メモリ使用量の問題が発生します。

私は主要なメモリ ホグを分離し、データを格納して操作するための別のデータ構造を理解する必要があるという結論に達しました。現在のところ、プログラムは整数、オブジェクト、文字列などの非常に大きな多次元配列になるものを使用しています。

動作のルールを導き出した後に、関連付けの設定を単純に再構成する方法がいくつかあります。多くの場合、単一の要素を追加または削除するか、多次元配列を単純に平坦化します。

私は主に一般的に C/C++ でプログラミングするので、Java で利用可能なデータ構造の専門家ではありません。静的配列を置き換えようとしているのは、2 番目の多次元配列を作成しなくても簡単にサイズ変更できる動的構造です。

現在起こっていることは、多次元配列からルール、オブジェクト、またはその他のさまざまなデータを追加および削除するたびに、まったく新しい構造を作成する必要があるということです。次に、すぐに新しい配列にコピーしています。

同じ多次元配列を単純に使用して、単純に新しい行と列を追加できるようにしたいと考えています。その後、一時的な値を保存して以前の値を上書きしたり、左、右にシフトしたりするだけで、構造内のデータを操作できるようにしたいと考えています。

法案に適合するJavaのデータ構造を思いつく人はいますか?

関連して、私は明示的なガベージ コレクションを調べましたが、System.Gc() を呼び出すか、チューニングによって JVM のガベージ コレクション動作を操作することによってのみ、JVM の収集を実際に提案できることがわかりました。より良い、またはより効果的な方法はありますか?

よろしく、 Edm

4

5 に答える 5

1
于 2013-06-26T04:38:24.650 に答える
1

静的配列を動的構造に置き換えるにArrayListは、データとともに自動的に成長する を使用します。2 次元のデータ構造を持たせるには、Listof をListas として使用します。

List<List<Integer>> dataStore = new ArrayList<List<Integer>>();
dataStore.add(new ArrayList<Integer>());
dataStore.add(Arrays.asList(1, 2, 3, 4));

// Access [1][3] as
System.out.println(dataStore.get(1).get(3)); // prints 4

ガベージコレクションを制御することに触れたので(Javaは実際にはそれ自体でかなり良い仕事をします)、メモリ管理が最も重要であるように思われます。これがそもそもリファクタリングを引き起こしているからです。

Flyweightアプリケーションのメモリ フットプリントを削減するために、オブジェクトを繰り返すのではなく、オブジェクトの共有に焦点を当てた GoF パターンを調べることができます。共有を有効にするには、flyweight オブジェクトをimmutableにする必要があります。

疑似コード:

// adding a new flyweight obj at [2][1]
fwObjStore.get(2).set(1, FWObjFactory.getInstance(fwKey));

public class FWObjFactory {
    private static Map<String, FWObject> fwMap = new HashMap<String, FWObject>();

    public static getInstance(String fwKey) {
        if (!fwMap.containsKey(fwKey)) {
            fwMap.put(fwKey, newFwFromKey(fwKey));
        }
        return fwMap.get(fwKey);
    }

    private static FWObject newFwFromKey(String fwKey) {
        // ...
    }
}
于 2013-06-26T04:40:52.570 に答える
0

「リストのリスト」の使用を検討します。たとえば、次のように宣言できます。

List<List<Object>> mArray = new ArrayList<List<Object>>();

新しい「行」を追加する必要があるときはいつでも、次のようにすることができます。

mArray.add (new ArrayList<Object>());

Listインターフェースをチェックして、Javaで s を使用して何ができるかList、どのクラスがインターフェースを実装しているかを確認してください (または独自のものを作成してください!)。

于 2013-06-26T04:34:41.010 に答える
0

Javaには多次元のものはありません.Javaには配列の配列があります。

ArrayListとして型パラメーターを指定して ArrayList を使用できます

ArrayList<ArrayList<yourType>> myList = new ArrayList<ArrayList<yourType>>();

また、GC について心配する必要はありません。必要に応じて収集されます。

于 2013-06-26T04:30:03.467 に答える
0

Lists2つを絡めて使ってみませんか?そのようです:

List<List<String>> rowColumns = new ArrayList<>();

// Add a row with two entries, or columns:
List<String> oneRow = Arrays.asList("Hello", "World!");
rowColumns.add(oneRow);

また、エントリがリストにマップされたマップの使用を検討してください。

ガベージ コレクションは、通常、Java で明示的に処理する必要はありません。通常、メモリ リークが最初に発生するたびに、メモリ リークを探します。そのような場合は、想定どおりに終了しないバックグラウンド スレッドまたはキャッシュ内の強い参照を探します。後者の問題について読みたい場合は、ここここから始めることができます。

于 2013-06-26T04:39:18.227 に答える