2

大量のデータをファイルに書き込むことに関しては、私はまったく得意ではありません。私はそのような構造を持つシミュレーションを持っています

typedef struct
{
   int age;
   float height;
   float weight;
   int friends [ 250000 ];
} Person;

そして、私は25万人もの人を抱えることができ、それぞれ250000人の友人(派閥)がいます。明らかに、これは大量のデータです。後でロードできるように各構造体を保存したい場合、Cで最も効率的な方法は何ですか?これが私がこれまで考えてきたことです

  1. write250,000グループのデータを含む巨大な文字列を作成してから、大量のメモリを使用するため、単一のデータを作成したくありません。
  2. また、250,000の異なるファイルを作成するのは遅いかもしれないので、作成したくありません。
  3. インデックスに基づいてファイルを追加します(つまり、人物1、次に人物2 ...)が、これも遅い場合があります。
  4. データをバイナリとして保存する(これはより効率的ですか?)

編集私は使用するための効率的なアプローチを探していますfwrite ()。つまり、すべてのデータを収集して単一のファイルに書き込む方が速いか、複数のファイルを作成してすべてのデータを事前に収集するオーバーヘッドを回避するかどうかです。

4

4 に答える 4

1

人々をループして、年齢、身長、体重のメンバー(3 fwrites)を保存し、次にfriend_countを保存してから、友達をループして1つずつ書き込むことができます。このすべてをfwriteで。Cライブラリがバッファリングし、必要に応じて大きな「書き込み」を行うため、I/Oの最適化について気にする必要はありません。

于 2012-07-05T17:28:15.777 に答える
0

あなたは[部分的に]RDBMS(データベース)を再発明しようとしていると思います。通常、再発明は悪い考えです。データを無料のデータベースシステム(Postgresなど)に保存することを検討してください。他にも利点があります。Cコードを記述せずにデータを調べることができます。
データベースがやり過ぎのように聞こえる場合は、BerkleyDBやSQLiteなどのより単純なファイルベースのデータベースストレージライブラリを使用してください。

于 2012-07-05T17:27:41.707 に答える
0

私はあなたの構造についてあまりはっきりしていません。

Person構造体配列があり、friends []には他のPersons配列のインデックスが含まれていますか?

最良の方法は、人と彼の友人を区別することです。

このようにして、固定サイズのPersonがあり、すべてのPersonを1つのファイルに保存し、Person12345のデータをすばやく読み戻すことができます。ファイルの先頭からfilepos12345 * sizeof(Person)にあります。

Friends配列は、

int *Friends[MAXFRIENDS]

配列-MAXFRIENDS*sizeof(int *)以上のメモリが必要です。250.000のフレンドの場合、64ビットシステムでは2メガバイトである必要があります。小さな変化。各ポインタは、その人のfriend[]配列を保持します。

次に、Personの友達は、たとえば/ dd / cc / aabbccddというディレクトリ内のファイルに入れられます。ここで、aabbccddはsprintf( "%08x"、PersonIndex)によって取得されます。dd / ccを使用すると、ツリーのバランスが少し良くなります。フレンドファイルを書き込むには、Friends [PersonIndex]をポイントし、必要な数のフレンドインデックスを書き込みます(FriendsNumberをPerson構造体に格納します)。

于 2012-07-05T17:39:18.670 に答える
0

私はHDF5のようなライブラリを調べて、このマシンでファイルを読み戻すだけでなく、ファイルを他の人に渡して、プラットフォームの移植性の問題を処理してもらうことができます。

于 2012-07-05T18:08:14.107 に答える