1

測定値から、基本的に寸法が 1000x1000 の浮動小数点数のテーブルを含むテキスト ファイルを取得します。これらは約 15MB のスペースを占有します。一連の結果ファイルが約 1000 個得られることを考えると、保存するのは受け入れられません。そのため、データを失うことなく、可能な限りそれらを圧縮しようとしています。私の考えは、予想される範囲で数値を〜1000ステップにグループ化し、それらを保存することです。これで十分な解像度が得られます。ただし、まだ 1.000.000 ポイントを考慮する必要があるため、結果のファイルはまだ約 4MB です。おそらくそれ以上圧縮することはできませんか?より大きな問題は、これにかかる計算時間です。現時点では、ファイルごとに 10 ~ 12 秒と見積もっています。つまり、1000 ファイルの場合は約 3 時間です。うわぁぁぁぁぁぁぁぁぁぁぁぁ。これは私が考えたアルゴリズムですが、何か提案はありますか? そこには'

import numpy

data=numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)
out=numpy.empty((1000,1000),numpy.int16)
i=0
min=-0.5
max=0.5
step=(max-min)/1000
while i<=999:
    j=0
    while j<=999: 
        k=(data[i,j]//step)
        out[i,j]=k
        if data[i,j]>max:
            out[i,j]=500
        if data[i,j]<min:
            out[i,j]=-500
        j=j+1
    i=i+1
numpy.savetxt('converted.txt', out, fmt="%i")

あなたが提供できるヒントを事前にありがとう!ヤコブ

4

3 に答える 3

4

numpy 配列をテキスト ファイルとして保存しているようです。より高速でスペース効率の良い方法があります。ダンプするだけです。

float を 32 ビット float として格納できる場合は、次を使用します。

data = numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)

data.astype(numpy.float32).dump(open('converted.numpy', 'wb'))

その後、あなたはそれを読むことができます

data = numpy.load(open('converted.numpy', 'rb'))

ファイルは1000x1000x4バイトで、約 4MB です。

numpy の最新バージョンは、16 ビット浮動小数点数をサポートしています。おそらく、フロートはリミッター範囲に収まるでしょう。

于 2011-08-04T13:35:23.867 に答える
2

numpy.savez_compressed多くの配列を単一の圧縮されたバイナリ ファイルに保存できます。

ただし、それほど圧縮することはできません。15 GB のデータがある場合、圧縮アルゴリズムによって魔法のように 200 MB に収まることはありません。データの一部を破棄する必要があり、どれだけ保持する必要があるかを決定できるのは自分だけです。

于 2011-08-04T13:35:15.943 に答える
1

zipfilebz2またはgzipモジュールを使用して、python から zip、bz2 または gz ファイルに保存します。合理的な時間内に自分で作成した圧縮スキームは、ほぼ確実に、これらの汎用的で最適化およびコンパイルされたソリューションよりも遅くなり、圧縮率が低下します。eumiro のアドバイスも参考にしてください。

于 2011-08-04T13:34:06.300 に答える