1

私は、ストレージとプロセッサの速度が制限されている組み込みデバイスで使用するためのフラットファイルSKUデータベースのセットアップを任されています。

基本的に、保存する必要のあるデータは次のとおりです。

SKU説明場所価格数量

ファイルは数百万のレコードで構成されます。

最も重要な考慮事項は、ストレージスペースと取得時間です。レコードはSKUでのみ取得する必要があり、読み取り専用であるため、ファイルはSKUで並べ替えることができます。

Pythonでこのデータにアクセスしたいと思います。だから私の質問はこれに帰着します。

この機能を提供できる既存のPythonライブラリはありますか、それとも自分で作成する必要がありますか?

答えが私自身を転がすために来た場合、誰かがそうするための提案、または良い参考文献を持っていますか?

4

6 に答える 6

4

Pythonバインディングを使用したSQLiteはどうですか?必要以上のものがありますが、標準のソフトウェアであり、十分にテストされています。

于 2010-02-13T02:27:27.483 に答える
4

古い方法は、gdbmモジュールのような単純なキー/値データテーブルを使用することです。Pythonにはそのサポートが付属していますが、私のマシンのデフォルトのPythonインストールには組み込まれていません。

一般的に、SQLiteを使用します。他の人が書いたように、それはPythonに標準で付属しており、すでに多くの組み込みシステムで使用されています。

レコードが固定長の場合は、bisectモジュールを使用できます。ファイルサイズ/レコードサイズは、ファイル内のレコード数を示します。バイセクト検索では、ファイル内でO(log(n))ルックアップが実行されるため、同等性をテストするためのアダプターを作成する必要があります。私はそれをテストしていませんが、ここにスケッチがあります:

import bisect

RECORD_SIZE = 50

class MatchFirst10Chars(object):
    def __init__(self, word):
        self.word = word
    def __lt__(self, other):
        return self.word < other[:10]

class FileLookup(object):
    def __init__(self, f):
        self.f = f
        f.seek(0, 2)
        self.size = f.tell() // RECORD_SIZE
    def __len__(self):
        return self.size

    def __getitem__(self, i):
        self.f.seek(i*RECORD_SIZE)
        return self.f.read(RECORD_SIZE)


SKU = "123-56-89 "
f = open("data_file")
fl = FileLookup(f)
i = bisect.bisect(fl, MatchFirst10Chars(SKU))

さらにファイルをgzipで圧縮し、gzipで圧縮されたファイルを探すこともできますが、これはスペースと時間のトレードオフであり、テストする必要があります。

于 2010-02-13T03:27:19.533 に答える
1

HDFはどうですか?SQLを必要とせず、データへの高速アクセスが必要な場合、Pythonでは数値データまたは構造化データに対してこれ以上高速なものはありません。

PythonwikiのDatabaseInterfacesセクションを見てください。それは包括的です。いくつかの「純粋な」Pythonオプション(SnakeSQLなど)がリストされていますが、これらはデプロイするのに少し適しています。そしてもちろん、非常に無駄のない生のBerkeleyDBなどが常にあります。

正直なところ、SQLiteはおそらくあなたのためにうまくいくでしょう。本当にパフォーマンスを向上させる必要がある場合は、BDBのようなレコードベースのフォーマットを検討することになります。

于 2010-02-13T02:30:21.063 に答える
1

cdbを提案してもいいですか?(Pythonバインディング:python-cdb。)

これは、あなたが持っているように、読み取り専用データに使用される形式です。基本的には256個の巨大なハッシュテーブルであり、それぞれが異なる数のバケットを持つことができます。cdbの優れた点は、ファイルをメモリにロードする必要がないことです。mmap必要なビットを入力するだけでルックアップを実行できるように構造化されています。

特に、行が均一な右マージンを作成するようにフォーマットされているため、cdb仕様は適切に読み取られます。:-D

于 2010-02-13T04:39:32.743 に答える
0

簡単な解決策はCPickleです。SOでも同様の質問を見つけることができます。

于 2010-02-13T02:53:40.143 に答える
0

Andrew Dalkeの回答のバリエーション(バイナリ検索を使用してSKUをすばやく見つけることができる)は、スペース要件を減らす可能性があり、ファイルの先頭に固定サイズのレコード(SKUごとに1つ)を設定し、次にすべての説明と場所(nullで終了する文字列が言うように)

場所や説明を固定長に埋める必要がないため、スペースを節約できます。また、重複する場所がたくさんある場合は、スペースを節約できます

ここに例があります:あなたが持っていると言う

SKU         16 bytes
Description Variable length
Location    Variable length
Price       4 bytes (up to $42949672.95)
Quantity    4 bytes (up to 4294967295)



 offset          SKU        desc_off   loc_off      Price      Quantity
0x00000000 SKU0000000000001 0x01f78a40 0x01f78a47  0x000003e8  0x000f4240
0x00000020 SKU0000000000002 0x01f78a53 0x01f78a59    ...
...
... # 999998 more records
...
0x01f78a40 Widget\x00
0x01f78a47 Head office\x00
0x01f78a53 Table\x00
0x01f78a59 Warehouse\x00
于 2010-02-13T04:01:55.393 に答える