1

約1,000万行と数列の大きなデータテーブルを保存する必要があります。私がする必要があることは次のように要約することができます:

1.列の値に基づいて、いくつかの行を選択する必要があります。

例:

行500:| 10 | 3 | 4 | 5 | 100 | 314 | 45 |

行501:| 13 | 5 | 7 | 4 | 160 | 210 | 40 |

行501:| 24 | 3 | 8 | 6 | 260 | 810 | 50 |

行602:| 34 | 7 | 9 | 6 | 350 | 760 | 10 |

ここで、最初の列の値は行IDと見なすことができます。ここで、IDは10、13、24、34です。

4番目の列の値が5より大きい行を検索しているとします。したがって、フィルタリング後の出力は次のようになります。

行500:| 10 | 3 | 4 | 5 | 100 | 314 | 45 |

行501:| 24 | 3 | 8 | 6 | 260 | 810 | 50 |

行602:| 34 | 7 | 9 | 6 | 350 | 760 | 10 |

2. 2番目のステップでは、列ごとにそれらを比較する必要があります。行500の2番目と3番目の列にそれぞれ値3と4があり、(3-4)も範囲(3-8)にあるとします。しかし、この範囲は(7-9)と一致しません

したがって、行500と行501の間には関係があります。出力は次のようになります。

10 24

24 34

3.値10が与えられたとします。次に、最初の列に10がある行を見つけ、7番目の列の値を5減らす必要があります。したがって、行は次のようになります。

行500:| 10 | 3 | 4 | 5 | 100 | 314 | 40 |

私はこれまで、matlabライブラリ関数を使用したこれらの操作にMatlabを非常に簡単に使用していました。ただし、コード全体をJavaで変換する必要があります。これを行う1つの方法は、大きな配列を使用し、forループを使用してすべての行にアクセスすることです。そのような大きなアレイには効率的でしょうか?この点で私を助けてください。

4

2 に答える 2

3

まず、 SQLLiteHyperSQLJavaDBなどのインメモリ RDBS を使用することをお勧めします。

その後、Google の guava ライブラリでTableを確認できます。

行ベースのルックアップはHashBasedTableTreeBasedTableを使用すると最速ですが、データがまばらに見えないため、ArrayTableを検討することをお勧めします。

最後に、この質問を見てください。

于 2012-04-08T09:17:30.270 に答える
1

私はあなたのニーズを定義しようとし、それに基づいて適切なデータ構造を提供します。1-要素への高速アクセスが必要です。これに基づいて、LinkedList の使用を避け、ArrayList または静的配列のいずれかを使用します。2-データが大きいため、すべてをメインメモリにロードしないことをお勧めします(動的ロード)

注:B +ツリーを使用してアクセスを最適化するより高度な方法がありますが、上記のことを深く試したくはありません。これ以上最適化する必要はないと思います(動的ロードを正しく実装する場合)そして効率的に)。

于 2012-04-08T09:28:35.553 に答える