2

100 万個のレコードの配列を作成する必要があるプログラムを作成しています。配列インデックスは一意の ID です (0 から 100 万は一意の製品 ID を表します)。最初に、すべての要素がゼロに初期化されます。それらは、販売された製品に応じて増加します。

ただし、この方法ではスペースの複雑さが大きくなります (4 * 100 万バイト)。後で、頻繁な更新が必要なのは特定の製品だけであることがわかりました。では、メモリ使用量を減らし、すべての製品を追跡できる方法はありますか?

4

4 に答える 4

1

頻繁に更新する必要がない場合は、すべての結果をファイルに保存できます。エントリを更新するときはいつでも、他のすべてのエントリと更新されたエントリを含む一時ファイルを作成できます。その後、 を使用して一時ファイルの名前を変更するだけですrename(temp,new);

ただし、100 万個のレコードの配列にはそれほど多くのメモリは必要ありません (わずか 4 メガバイト)。したがって、あなたのアプローチは最良かつ最も簡単なアプローチです。

(アルゴリズム的に) 最善の方法は、ハッシュ テーブルを作成してすべてのエントリを格納することです。しかし、C の専門家でない場合、ハッシュ テーブルを作成するのは問題になる可能性があります。

于 2012-09-02T16:58:06.310 に答える
1

これは、メモリ内配列というよりも、データベース内のテーブルの状況のように思えます。ユースケースで許可されている場合は、代わりにデータベースを使用します。

それ以外の場合、ユースケースの場合:

  1. 製品のかなりの部分が最終的に使用されます。
  2. RAMには限りがあり、
  3. 外部ストレージ(ディスク、シリアルメモリ)が利用可能、
  4. RAM 速度に匹敵する平均的なアクセス パフォーマンスが必要であり、
  5. 最悪の場合のアクセス時間の増加は許容されます。

次に、ある種のキャッシング スキームを試すことができます (lru かな?)。これにより、より多くのコード スペースが使用され、平均アクセス時間がいくらか増加し、最悪の場合のアクセス時間がさらに大幅に増加します。

製品の大部分がめったに使用されないだけでなく、まったく使用されない場合は、@ fatrock92 のハッシュ テーブルの提案を検討する必要があります。

于 2012-09-02T17:04:08.923 に答える
0

リンクリストを使用できるため、必要なときにいつでもリストの要素を追加または更新できます。
また、各ノードで前回のアクセスを保持できるため、最近使用されていないノードを削除できます。

于 2012-09-02T17:09:13.423 に答える
0

配列にはメモリの動的割り当てを使用することをお勧めします。malloc または realloc を使用すると、メモリをより適切に割り当てることができます。malloc と realloc の使用方法を知っていると思います。

于 2012-09-02T16:59:55.483 に答える