3

私はシミュレーションを構築する計画段階にあり、メモリと速度の考慮事項に基づいて、データを表現する方法についてのアイデアが必要です。

各時間ステップで、シミュレーション プロセスは 10^3 から 10^4 の新しいデータ レコードを作成し、新しいレコードまたは既存のレコード (10^6 から 10^8 のレコードがあります) を調べてから、削除または変更します。

各レコードには 3 ~ 10 個の単純なフィールドがあり、それぞれが整数または複数の ASCII 文字の文字列です。さらに、各レコードには 1 ~ 5 個の他のフィールドがあり、それぞれが整数を含む可変長リストです。一般的なレコードの重さは 100 ~ 500 バイトです。

変更または削除プロセスは次のように機能します。このレコードについて、引数がこのレコードのいくつかのフィールドの値であり、別のレコードのこれらのフィールドの値である関数を計算します。結果に応じて、プロセスは何らかの方法でそのフィールドを削除または変更する準備をします。

次に、他のレコードごとに繰り返します。次に、次のレコードに移動して繰り返します。すべてのレコードが処理されると、シミュレーションは次の時間ステップに移動する準備が整います。

次の時間ステップに移る直前に、すべての削除と変更を準備どおりに適用します。

許可されるレコードが多いほど、シミュレーションは向上します。すべてのレコードが RAM にある場合、マイナス面はシミュレーション サイズであり、おそらくプラス面は速度です。シミュレーションはリアルタイムである必要はありませんが、明らかに遅すぎたくありません。

メモリ内の各レコードを表すために、次のオプションを知っています。リストまたは辞書 (いくつかのリストがネストされています)、またはクラス インスタンスです。すべてのレコードを保存して別の日にシミュレーションを続行するには、慣れ親しんだ順に次のオプションがあります: 各行がレコードである csv ファイル、または単にすべてのレコードを RAM に入れ、それらをファイルに入れます (おそらくpickle)、またはある種のデータベースを使用します。

私は Python の基本とジェネレーターなどのいくつかの概念を学びましたが、データベースは学んでおらず、ピクルス化も試していません。明らかにもっと学ぶ必要があります。可能であれば、複数のコンピューターを使用するのは避けたいと思います。なぜなら、私は 1 台しか持っていないからです。同時実行は、あまりにも恐ろしく見えるからです。

メモリ内のレコードを表現する方法と、シミュレートされたシステムを保存する方法について、アドバイスはありますか?

4

1 に答える 1

1

最悪の場合、10 ** 8レコードとレコードあたり500バイトを使用すると、RAMが大量になるため、ある程度の柔軟性を設計し、すべてのレコードが常にRAMに常駐するとは限らないと想定する価値があります。レコードがどこにあるかの詳細を隠す抽象化クラスを作成できます。

class Record(object):
    def __init__(self, x, y, z):
        pass # code goes here
    def get_record(id):
        pass # code goes here

名前を使用する代わりに、名前get_record()を使用する__index__()と、クラスはリストのように機能しますが、データベースに送信されたり、RAMキャッシュを参照したりする可能性があります。ID値として整数を使用するだけです。次に、永続性ストアについて気が変わっても(データベースからpickleに切り替えるなど)、実際のコードは変更されません。

また、非常に巨大なスワップファイルを作成し、仮想メモリシステムに実際のRAMの内外でのシャッフルレコードを処理させることもできます。これは簡単に試すことができます。計算を中断して状態を保存する簡単な方法はありません。

名前付きタプルであっても、各レコードをタプルとして表すことができます。タプルは、Pythonの「コンテナ」オブジェクトの中で最もオーバーヘッドが少ないと思います。(名前付きタプルは、名前を1つの場所に一度だけ格納するため、オーバーヘッドも低くなります。)

于 2013-03-06T01:20:33.423 に答える