41

私はいくつかの動的プログラミング コードを実行し (コラッツ予想 =P を力ずくで反証しようとしました)、dict を使用して、既に計算したチェーンの長さを格納していました。明らかに、ある時点でメモリが不足しています。dictスペースがなくなったときに、その一部をディスクにページアウトするa のバリアントを使用する簡単な方法はありますか? 明らかに、メモリ内の辞書よりも遅くなり、おそらくハードドライブのスペースを消費することになりますが、これはそれほど無駄ではない他の問題にも当てはまる可能性があります。

ディスクベースの辞書はほとんどデータベースであることに気付いたので、sqlite3 を使用して手動で実装しましたが、賢明な方法ではなく、DB 内のすべての要素を一度に 1 つずつ検索しました...約 300 倍遅くなりました。

一度に1つだけをメモリに保持し、効率的な方法でそれらをページアウトして、独自のdictのセットを作成する最も賢い方法はありますか?

4

8 に答える 8

58

サードパーティの突き出しモジュールも一見の価値があります。単純な dict のようなオブジェクトであるという点で shelve に非常に似ていますが、さまざまなバックエンド (ファイル、SVN、S3 など) に格納でき、オプションの圧縮を提供し、スレッドセーフですらあります。とても便利なモジュールです

from shove import Shove

mem_store = Shove()
file_store = Shove('file://mystore')

file_store['key'] = value
于 2008-10-23T07:22:01.207 に答える
22

Hash-on-disk は通常、Berkeley DB などで対処されます。いくつかのオプションがPython Data Persistence のドキュメントにリストされています。メモリ内キャッシュを前面に出すこともできますが、最初にネイティブ パフォーマンスをテストします。オペレーティング システムのキャッシュが適切に配置されていれば、ほぼ同じ結果になる可能性があります。

于 2008-10-22T17:34:09.927 に答える
7

shelveモジュールがそれを行うかもしれません。いずれにせよ、テストは簡単でなければなりません。それ以外の:

self.lengths = {}

行う:

import shelve
self.lengths = shelve.open('lengths.shelf')

唯一の落とし穴は、棚の鍵が紐でなければならないことです。そのため、交換する必要があります

self.lengths[indx]

self.lengths[str(indx)]

(Charles Duffyの投稿へのコメントによると、キーは単なる整数であると想定しています)

組み込みのメモリ内キャッシュはありませんが、オペレーティング システムがそれを行う場合があります。

[実際には、これは正しくありません: 作成時に引数 'writeback=True' を渡すことができます。これの目的は、リストやその他の変更可能なものをシェルフに正しく保存することです。ただし、副作用として、ディクショナリ全体がメモリにキャッシュされます。これはあなたに問題を引き起こしたので、おそらく良い考えではありません:-)]

于 2008-10-23T02:21:40.547 に答える
6

前回このような問題に直面したとき、dictではなくSQLiteを使用するように書き直し、パフォーマンスが大幅に向上しました。そのパフォーマンスの向上は、少なくとも部分的にはデータベースのインデックス作成機能によるものでした。アルゴリズムに応じて、YMMV。

SQLiteクエリを実行し、記述するコードが少ないシン__getitem__ラッパー__setitem__

于 2008-10-22T17:37:24.880 に答える
3

少し考えれば、shelf モジュールでやりたいことを実行できるように思えます。

于 2008-10-22T18:01:42.630 に答える
1

shelve が遅すぎると考えており、sqlite を使用して独自の dict をハックしようとしたことを読みました。

別の人もこれをしました:

http://sebsauvage.net/python/snyppets/index.html#dbdict

これは非常に効率的です (そして、sebsauvage は非常に優れたコーダーです)。多分あなたはそれを試してみることができますか?

于 2008-11-18T10:51:35.327 に答える
0

次に取得される可能性が最も高いアイテムを知るためのヒューリスティックがある場合は、一度に複数のアイテムを持参する必要があります。また、Charlesが言及しているようなインデックスを忘れないでください。

于 2008-10-22T17:50:46.023 に答える