11

次の問題があります。膨大な量の情報 (最大 32 GB)を保存し、できるだけ速く操作できるようにする必要があります。それを行うための最良の方法は何だろうと思っています(プログラミング言語の組み合わせ+ OS +あなたが重要だと思うものは何でも)。

私が使用している情報の構造は、倍精度浮動小数点数 (8 バイト) の 4D 配列 (NxNxNxN) です。現時点での私の解決策は、4D 配列を 2D 配列にスライスし、それらをコンピューターの HDD の個別のファイルに保存することです。これは非常に遅く、データの操作は耐えられないため、これはまったく解決策ではありません!

自国のスーパーコンピューティング施設に移り、すべての情報を RAM に保存することを考えていますが、それを利用するアプリケーションを実装する方法がわかりません (私はプロのプログラマーではないので、どの本も/参照は私を大いに助けます)。

私が考えている別の解決策は、大量の RAM を備えた専用サーバーを購入することですが、それで問題が解決するかどうかはわかりません。だから今、私の無知のせいで、最善の方法を選択することができません。

あなたがこの状況にいたらどうしますか?私はどんな考えにもオープンです。

前もって感謝します!


編集:十分な情報を提供できなくて申し訳ありません。より具体的にしようと思います。

離散化された 4D 数学関数を格納しています。実行したい操作には、配列の転置 (b[i,j,k,l] = a[j,i,k,l] などの変更)、配列の乗算などが含まれます。

これは提案された実験のシミュレーションであるため、操作は 1 回だけ適用されます。結果が得られたら、データに対してさらに操作を実行する必要はありません。


編集 (2):

また、将来的にはより多くの情報を保存できるようにしたいと考えているため、ソリューションは何らかの形でスケーラブルでなければなりません。現在の 32 GB の目標は、N=256 ポイントの配列が必要なためですが、N=512 (つまり、512 GB を格納することを意味します!!) を使用できればより良いでしょう。

4

14 に答える 14

3

Amazon の「High Memory Extra Large Instance」は 1時間あたりわずか 1.20 ドルで、メモリは34 GB です。このプログラムを常に実行していないと仮定すると、便利だと思うかもしれません..

于 2010-04-13T14:09:02.393 に答える
2

まともな答えは、データにどのようにアクセスする必要があるかによって異なります。ランダムアクセス?シーケンシャルアクセス?

32GBはそれほど大きくありません。

どのくらいの頻度でデータを処理する必要がありますか? (生涯 | 年 | 日 | 時間 | ナノ秒) ごとに 1 回? 多くの場合、物事は一度だけ行う必要があります。これは、ソリューションを最適化するために必要な量に大きな影響を与えます。

どのような演算を実行しますか (乗算について言及しています)? 一連の操作に必要なすべてのデータがチャンクに含まれるように、データをチャンクに分割できますか? これにより、並列実行のために分割しやすくなります。

最近購入するほとんどのコンピュータには、32 GB のメモリを保持するのに十分な RAM が搭載されています。そのためだけにスーパーコンピューターは必要ありません。

于 2010-04-13T13:51:53.137 に答える
2

Chris が指摘したように、データをどうするつもりですか。

さらに、(リレーショナル) データベースに格納する方が、ハードドライブから読み取るよりも高速になると思います。RDBMS がキャッシュなどの最適化を実行するからです。

于 2010-04-13T13:52:35.143 に答える
2

問題を MapReduce として表すことができる場合は、Hadoop などのディスク アクセス用に最適化されたクラスタリング システムを検討してください。

あなたの説明はより数学集約的に聞こえます。その場合、すべてのデータを一度にメモリに入れたいと思うでしょう。1 台のマシンに 32 GB の RAM を搭載することは不合理ではありません。Amazon EC2は、最大 68 GB の仮想サーバーを提供します。

于 2010-04-13T14:09:50.530 に答える
1

データをメモリに読み込む代わりに使用してみることをお勧めしmmapますが、32Gb ファイルで動作するかどうかはわかりません。

于 2010-06-06T18:45:01.717 に答える
1

詳細情報がなくても、すべてのデータに可能な限り迅速にアクセスする必要がある場合は、プログラミング言語に C を使用し、O/S として *nix のフレーバーを使用し、RAM を購入すると、現在は比較的安価です。これは、あなたが何に精通しているかにもよりますが、windows ルートに行くこともできます。しかし、他の人が述べたように、このデータをどのように使用しているかによって異なります.

于 2010-04-13T13:55:25.973 に答える
1

これまでのところ、非常に異なる答えがたくさんあります。上記の 2 つの良い出発点があります。David はいくつかのハードウェアを提案し、誰かが C の学習について言及しました。これらは両方とも良い点です。

C は、速度とダイレクト メモリ ページングに関して必要なものを提供します。最後に行うことは、データに対して線形検索を実行することです。それは遅い - 遅い - 遅い。

ワークフローを決定します。ワークフローが直線的である場合、それは 1 つのことです。ワークフローが線形でない場合は、メモリ内のページを参照するバイナリ ツリーを設計します。B ツリーに関する情報は、インターネット上にたくさんあります。さらに、これらの B ツリーは、メモリ ページングを設定および操作できるため、C での作業がはるかに簡単になります。

于 2010-04-13T16:32:23.180 に答える
1

用途によっては、一部の数学的および物理的な問題はほとんどゼロになる傾向があります (有限要素モデルなど)。これがデータに当てはまると予想される場合は、これらすべてのゼロを実際にメモリまたはディスクに格納する代わりに、スパース行列を使用することで大幅にスペースを節約できます。

ウィキペディアで説明を確認し、これがニーズを満たすかどうかを判断してください: http://en.wikipedia.org/wiki/Sparse_matrix

于 2010-04-13T16:34:05.427 に答える
1

ここに別のアイデアがあります:

SSD を使用してデータを保存してみてください。非常に少量のランダム データを取得しているため、SSD の方がおそらくはるかに高速です。

于 2010-04-13T17:26:35.287 に答える
0

転置の場合、実際には、どのインデックスが何であるかについての理解を変える方が速いです。つまり、データをそのままにして、代わりに、b[i][j][k][l]フェッチ(または更新)する要求に変更されるアクセサーデリゲートをラップしますa[j][i][k][l]

于 2010-04-13T14:54:25.440 に答える
0

この手順で解決できるでしょうか?

最初にM子プロセスを作成し、それらを並列に実行します。各プロセスはクラスターの専用コアで実行され、配列の一部の情報をそのコアの RAM にロードします。

親プロセスは配列のマネージャーとなり、適切な子プロセスを呼び出して (または接続して)、データの特定のチャンクを取得します。

これは、HDD ストレージのアプローチよりも高速ですか? それともハンマーでナッツを割っていますか?

于 2010-04-13T15:56:08.587 に答える
0

大量のデータの処理を処理する方法は、通常、次の要因を中心に展開されます。

  • データ アクセスの順序/参照の局所性: データを独立したチャンクに分離して、独立して処理するか、シリアル/シーケンシャル方法で処理するか、順序をほとんどまたはまったく指定せずにデータにランダム アクセスするか

  • CPU vs I/O バウンド: 処理時間は、データの計算またはストレージとの間での読み取り/書き込みに多く費やされていますか?

  • 処理頻度: データは 1 回のみ、数週間ごと、毎日などのように処理されますか?

データ アクセスの順序が基本的にランダムである場合は、できるだけ多くの RAM にアクセスするか、少なくとも部分的に順序を整理する方法を見つけて、アクセス時にメモリ内に必要なデータをできるだけ少なくする必要があります。同時。仮想メモリ システムは、物理 RAM の制限を超えて大量のスワッピングが発生すると、すぐに速度が低下します。問題のこの側面を解決することは、おそらく最も重要な問題です。

上記のデータ アクセス順序の問題を除けば、あなたの問題に重大な I/O の問題があるとは思いません。32 GB の読み取り/書き込みは通常、現在のコンピューター システムでは数分で測定され、最大 1 テラバイトのデータ サイズでも数時間以上かかることはありません。

プログラミング言語の選択は、それが優れた最適化コンパイラと適切なネイティブ ライブラリを備えたコンパイル済み言語である限り、実際には重要ではありません。C++、C、C#、または Java はすべて妥当な選択です。私が取り組んできた最も計算量が多く I/O 集約型のソフトウェアは、実際には Java であり、数千の CPU コアを備えた高性能スーパーコンピューティング クラスターに展開されています。

于 2010-06-06T18:16:53.677 に答える
0

データベース技術全体は、RAM に収まりきらない膨大な量のデータを操作するためのものです。したがって、それが出発点になるかもしれません (つまり、優れた dbms 原則の本を入手し、インデックス作成、クエリ実行などについて読んでください)。
データにアクセスする必要がある方法に大きく依存します - 飛び回ってランダムな情報にアクセスする必要がある場合は、問題がありますが、データの処理を構造化して、1 つのデータに沿ってスキャンすることができます。軸 (次元)。次に、より小さなバッファーを使用して、既に処理されたデータを継続的にダンプし、新しいデータを読み取ることができます。

于 2010-04-13T14:01:56.203 に答える
0

私がまずお勧めするのは、オブジェクト指向言語を選択し、実際の実装方法を気にせずに 4 次元配列を操作できるクラスを開発または見つけることです。

このクラスの実際の実装では、おそらくメモリ マップト ファイルを使用するでしょう。これは、低電力の開発マシンから、実稼働コードを実行する実際のマシンまで拡張できるためです (これを実行する必要があると想定しています)。そのため、パフォーマンスが重要です。一晩実行できる場合は、民生用 PC で十分かもしれません)。

最後に、アルゴリズムとデータのデバッグが完了したら、メモリ内のすべてのデータを保持できるマシンで時間を購入することを検討します。たとえば、 Amazon EC2は、68 GB のメモリを搭載したマシンを 1 時間あたり 2.40 ドルで提供します (スポット インスタンスを使用する場合はそれより安くなります)。

于 2010-04-13T14:12:56.240 に答える