2011-07-11 4 views
11

リストのためのPythonのネイティブ機能は、完全にロック辞書&を設定します。データが本当に大きくなったときにネイティブ機能を使用し続ける方法はありますか?私が取り組んでいる問題は、非常に大きなリストのマッチング(交差)です。私はまだ限界を押し進めていません - 実際には私は限界が何であるか分かりませんし、データが予想通りに成長した後に大きな再実装で驚いて欲しくないです。データベースを使用してPythonリスト、セット、または辞書を不可視に実装できますか?

Google App Engineのような実用的な規模の制限を宣言し、永遠にそのままネイティブ機能を使用し続け、これについて実際には考えていないものに展開するのは妥当ですか?

リスト、セットまたはディクショナリがPython管理のメモリとDBのどちらにあるのかを隠すことのできるPythonの魔法がありますか?物理的なデータの展開はコードの中とは区別できますか?

あなたは、Python Super Expertさん、リストを扱い、データ量が増えるにつれて& dictsをどうやって設定しますか?

+8

氏とPythonのスーパーエキスパート*は[pythonistas](http://pythonist.net/~goodger/projects/pycon/2007/idiomatic/handout.html)*と呼ばれています。 ;-) – Aufwind

+0

任意のPythonオブジェクトをシリアライズしてデシリアライズするのは非常に難しくありませんが、pickle/jsonなどを使用してint、str、list、dictなどのPythonオブジェクトのサブセットを永続化するのは簡単です。ただし、データの永続性は、問題の小さな部分のみで構成されます。解決しなければならないもう一つの問題は、オブジェクトをデータベースにマップするためのマッパーを作成する必要があることです。 PostgreSQLやMySQLなどのリレーショナルデータベースを使用している場合は、SqlalchemyのようなORMを見てみましょう。ただし、GAEのbigtableしか使用できない場合は、独自のORMを書く必要があります。 –

+1

@Druss:さあ。自分のために、私はヘビの魅力的な人です。 –

答えて

8

の本質的な機能はリストの固有の機能であり、具体的には&辞書です。ただし、とsequence typesをエミュレートするクラスを作成するには、methods with special namesを定義します。つまり、リストのように動作するクラスを作成できますが、そのデータはSQLデータベースまたはGAEデータストアに格納されます。簡単に言えば、これはORMの機能です。しかし、オブジェクトをデータベースにマッピングすることは非常に複雑で、独自のORMを作成するのではなく、既存のORMを使用することはおそらく良い考えです。

ワンサイズの解決策はありません。特にGAEは、マジックフェアリーダストのようなものではありません。拡張可能なアプリケーションを作成する際に留意すべきいくつかの制限があります。それらのうちのいくつかはcomputational complexityのように一般的ですが、その他はコードが実行される環境に固有のものです。GAE では、最大応答時間は30秒に制限され、データストアをクエリする は他のデータベースと異なる動作をします。

具体的な問題を知らなくても具体的なアドバイスをするのは難しいですが、GAEが適切な解決策であるかどうかは疑問です。

大規模なデータセットで作業する場合は、最初からそのことを覚えておく必要があります。そうしないと、コードセット、アルゴリズム、データ構造が再構築されます。

+1

最大応答時間30秒は、ユーザーに面会する要求にのみ適用されます。オフライン要求は10分に制限され、バックエンドには実行制限がありません。 –

+0

あなたは本当に正しいです、明確化のためにありがとうございます。 –

+0

"リスト、セット、辞書のネイティブ機能"とは、(1)これらがネイティブデータ型であり、より基本的な型からまとめる必要があるものではなく、(2) 、イテレータ、ジップ、マップ、縮小など –

0

ORMを使用することができます:オブジェクトリレーショナルマッピング:クラスはテーブルを取得し、オブジェクトは行を取得します。私はDjango ORMが好きです。それ以外のWebアプリケーションにも使用できます。私はGAEでそれを使用したことはありませんが、可能だと思います。

+0

App Engineはリレーショナルデータベースを使用しないため、リレーショナルマッピングを使用することはできません。 – geoffspear

+0

django-nonrel(http://www.allbuttonspressed.com/projects/django-nonrel)は、SQLデータベースのように、GAEのORMモデルを提供します。しかしAFAIKはまだ進行中です。 – guettli

2

あなたは私の夢を記述しています!しかし、私はあなたがそれをすることはできないと思う。私はいつもPythonのためにLINQのようなものを望んでいましたが、その言語はネイティブデータベース操作AFAIKのPython構文を使用することを許可していません。可能であれば、リストを使用してコードを記述し、同じコードを使用してデータベースからデータを取得することができます。

スケーラブルなプラットフォームに移行するのは簡単ではないため、リストとセットだけに基づいて多くのコードを書くことはお勧めしません。 ORMのようなものを使うことをお勧めします。 GAEにもits own ORM-like systemがあり、SQLAlchemySQLObjectなどの他のものを使用することもできます。 SQLite。

残念ながら、リスト内包などの素晴らしいものを使用してデータベースからデータをフィルタリングすることはできません。確かに、DBから取得した後にデータをフィルタリングすることはできますが、オブジェクトのクエリやデータベースからの多くのオブジェクトを返すために、SQLのような言語でクエリを作成する必要があります。

OTOHには、Buzhugという自然なPython構文を使用できるPythonで書かれた、興味のある非リレーショナルデータベースシステムがあります。私はそれを使用したことがないと私はそれが私はそれに私のお金を入れないようにスケーラブルであるかどうかわからない。しかし、あなたはそれをテストし、それがあなたを助けることができるかどうかを見ることができます。

+0

もちろん、あなたはそれを行うことができます。データベースとの間で読み書きを行うクラスを作成することができます。特別な名前のメソッド( '__getattr__'など)をすべて実装すると、辞書やリストとまったく同じように動作させることができます。 –

+0

もちろんできます!しかし、あなたのクラスはデータベースにさまざまなコマンドを送信しません。つまり、「d.name == "John"」の場合は、[SELECT * FROM Data D WHERE dのようなSQLクエリーになるように、[dの場合はdのd]のようなリストの理解を行うクラスを書くことはできません。 name = 'John''を呼び出し、クエリ結果を返します。可能ではありません(少なくとも簡単にはできません)ので、たくさんのデータを管理する場合は、リスト操作に依存するOPを提案しません。私はそれを明確にするために私の質問を更新しました。 – brandizzi

+0

@brandizzi 'Data'がフィールドがデータベースのフィールドである名前付きタプルを返す' __iter __() 'メソッドを持っている場合、それは確かに可能です。 http://docs.python.org/dev/py3k/reference/datamodel.html?highlight=data%20model#object.__iter__およびhttp://docs.python.org/dev/py3k/library/collections.htmlを参照してください。 #collections.namedtuple。それほど難しいことではありません。 – Evpok

関連する問題