3

非常に大きなデータセット(1〜10 milレコード、場合によってはそれ以上)をドメイン固有言語(唯一の出力メカニズムはCスタイルのfprintfステートメント)からPythonに転送する必要があります。

現在、DSLを使用しfprintfてレコードをフラットファイルに書き込んでいます。フラットファイルは次のようになります。

x['a',1,2]=1.23456789012345e-01
x['a',1,3]=1.23456789012345e-01
x['a',1,4]=1.23456789012345e-01
y1=1.23456789012345e-01
y2=1.23456789012345e-01
z['a',1,2]=1.23456789012345e-01
z['a',1,3]=1.23456789012345e-01
z['a',1,4]=1.23456789012345e-01

ご覧のとおり、各レコードの構造は非常に単純です(ただし、倍精度浮動小数点数を20文字の文字列として表現するのは非常に非効率的です!):

<variable-length string> + "=" + <double-precision float>

私は現在Pythonを使用して各行を読み取り、「=」で分割しています。

Pythonが読みやすくするために、表現をよりコンパクトにするためにできることはありますか?ある種のバイナリエンコーディングは可能fprintfですか?

4

2 に答える 2

1

float値をシリアル化するためのコンパクトなバイナリ形式は、基本符号化規則(BER)で定義されています。そこでは「リアル」と呼ばれます。Python用のBERの実装が利用可能ですが、作成するのもそれほど難しくありません。C用のライブラリもあります。この形式(設計されたもの)またはバリアント(CER、DER)を使用できます。そのようなPython実装の1つはpyasn1です。

于 2013-01-08T04:23:21.243 に答える
1

エラー....Pythonからこのデータを1分間に何回読み取っていますか?

私のシステムでは、1秒以内に2,000万レコード(約400MB)のこのようなファイルを読み取ることができたからです。

限られたハードウェアでこれを実行しているのでない限り、何も心配しすぎていると思います。

>>> timeit("all(b.read(20) for x in xrange(0, 20000000,20)  ) ", "b=open('data.dat')", number=1)
0.2856929302215576
>>> c = open("data.dat").read()
>>> len(c)
380000172
于 2013-01-08T04:30:04.870 に答える