3

私は本質的にイーサネットデバイスをスニッフィングし、特定のパターンを研究するアプリケーションを作成しました。PythonとScapyを使用してデータをキャプチャしています。後世やパターン研究のためにデータベースにデータを取り込む必要があるため、以下の戦略を検討しています。

1)高性能のKey-Valueストアを使用して基本データをキャプチャしたいと考えています。これは基本的に、約200個のキーを持つkey:valueストアになります。2)1時間ごとにキーストアをプールし、特定の条件とパターンに基づいて、K:Vストアに保存されている値に基づいてPostgresデータベースにデータを入力します。

K:VにはRedisを使用する予定です。データベース、ファイルベースのキャッシュなどを含む他のソリューションを検討しましたが、パフォーマンスのボトルネックがあります。1つには、毎分処理される数千のパケットがあり、データベースとの間でSQL呼び出しを行ったり来たりすると、プログラムの速度が低下します。

私はRedisを使ったことがありません。しかし、これが最も高速で効率的なK:VNoSQLデータストアだと言われています。そして、redis python APiはそれを非常にPythonicにします。基本的に、データベースストアには200の奇数キーと、キーの80%に関連付けられた長い整数の値、または場合によっては200文字未満のcharフィールドがあります。

質問

1)これは正しいアプローチですか?2)考慮すべき他のパラメータは何ですか?3)メモリはどのくらいの規模になりますか?より高速なパフォーマンスのためにメモリサイズを最適化するには、どうすればよいですか?4)メモリサイズを計算するにはどうすればよいですか?

Pythonは私たちが知っている唯一の言語です。したがって、C /C++のような提案は魅力的ではないかもしれません。

絶対的に正確な結果を得るのではなく、パターンを調査することを目的としているため、たまにいくつかのパケットが失われることはありません。キーの数は同じままで、値は上下する可能性があります。

将来のメインプルはSQLを集中的に使用するため、最終的に計算されたデータをRDBMSに格納する必要があります。

4

1 に答える 1

4

1)これは正しいアプローチですか?

確かにこのように実装でき、Redisはこの種のワークロードを維持するのに十分な速度です。ボトルネックは、Redis自体ではなく、Pythonコードになります。

2)考慮すべき他のパラメータは何ですか?

Redisではなくメモリ(辞書)にデータを蓄積することをお勧めします。フルfsyncAOFを使用してRedisを構成する場合を除いて(これにより速度が低下します)、RedisはPythonプロセスよりもシステムクラッシュに対する耐性がそれほど高くありません。

ただし、複数のキャプチャプロセスがあり、PostgreSQLに保存する前にデータを集約する必要がある場合は、Redisが非常に優れたソリューションです。

3)メモリはどのくらいの規模になりますか?より高速なパフォーマンスのためにメモリサイズを最適化するには、どうすればよいですか?

200の値がある場合、メモリ消費は問題になりません(無視できるため)。Redisはすでにこの種のワークロードに対して十分に高速であるため、ここで特別なトリックを使用する必要はありません。

ただし、キーのリストを維持し(KEYSコマンドに依存せずにキーにアクセスできるようにするため)、パイプラインを使用して効率的な方法で(つまり、キーごとではなく)データを取得する必要があります。複数のキーがある場合は、SORTコマンドを使用してすべてをワンショットでフェッチするか、200個のキー/値を格納してワンショットで取得するための一意のハッシュオブジェクトを定義することを検討してください。

4)メモリサイズを計算するにはどうすればよいですか?

ここでは役に立たない。ただし、本当に必要な場合は、Redisインスタンスを起動し、データを配置し、INFOコマンドを使用して統計を取得します。データをダンプし、次のPythonスクリプトを使用して、ダンプファイルから統計を取得することもできます:https ://github.com/sripathikrishnan/redis-rdb-tools

于 2012-06-06T18:44:52.407 に答える