2017-01-11 3 views
3

ユーザー/アーティスト/プレイカウントデータセットを読み込み、好きなアーティストを予測するPythonスクリプトを作成しました。しかし、データベース(ダウンロードした.tsvファイル)が大きいので、それを読んで、必要な情報を辞書に保存するのに時間がかかります。これをどのように最適化できますか?ロードされたデータベースを保存する方法があるので、予測を作成するたびに再度ロードする必要はありませんか?スクリプトが実行されるたびにデータベースを読み込まないようにする

ありがとうございました。

+1

実際のデータベースを使用してください。一度にすべてをメモリに保持しようとはしません。 'sqlite'はとても簡単です。別のオプションは、デーモンプロセスが常に実行され、dbがロードされるようにすることです。 IPC(パイプ、ソケットなど)を介して通信します。 –

+0

私はこのソリューションがかなり便利だと知った:http://stackoverflow.com/a/6687707/6027071 – Alejandro

答えて

2

shelve moduleを使用して辞書を保存して読み込むことができます。これは、辞書を作成する処理時間がメモリにロードするのに要する時間(アルゴリズムが複雑であるか、辞書が小さい場合)に比べて大きい場合に利点があります。

あなたの辞書が依然として大きくなる場合は、ファイルポインタのオフセットを辞書値として保存することができます。つまり、ディクショナリに情報そのものを格納するのではなく、ディクショナリの値を曲に関する情報にする場合は、対応する行が始まるTSVファイルにバイトオフセットを格納します。次に、その情報にアクセスするには、TSVファイルを開き、オフセットを探して、行を読み取り、解析してその曲を表すオブジェクトを構築します。シークは速く、少なくともファイル全体を読むよりはるかに高速です。あるいは、mmap moduleを使用してファイルをメモリマップし、効果的にバイトの配列として扱うことができます。これは、必要なバイト数がわかっている場合(または少なくとも上限がある場合)に特に便利です。

他のプログラミング言語で書かれた他のシステムとの互換性を維持したい場合や、人間が読めるようにする場合は、json moduleを使用して辞書をJSONとして保存することができます。私はあなたの辞書があまりにも大きくない場合にのみこれをお勧めします。

あなたが試みることのできるもう1つの解決策は、辞書の情報を最初にデータベースに格納することです。データベースは、それらに迅速にアクセスできるように構成されています。 Pythonの標準ライブラリには、sqlite3 moduleが含まれており、これを使用してSQLiteデータベースにアクセスできます。これはうまくいくはずです。しかし、既にデータベースサーバーを稼働させている場合や、複数のプロセスが同時にデータベースにアクセスする場合など、別々のデータベースサーバーを使用する特別なニーズがある場合は、SQLAlchemyを使用して任意のSQLデータベースにデータを格納して読み込むことができます。

完全性のために、私は​​についても言及しますが、それはかなり多くのPythonオブジェクトを格納するために使用できますが、私はあなたがそれを直接使う必要はないと思います。ディクショナリタイプのデータを格納およびロードするためのより効率的な方法があります。

関連する問題