2

多次元配列データをテキストファイルに書き込んでいます。私はこの行を賢くやっています。ファイルのサイズは大きくなり続けます。出力ファイルのサイズを可能な限り小さくするには、どのような手法に従う必要がありますか?

4

2 に答える 2

5

配列に多くのゼロがある場合は、スパース行列表現を使用できます。行列全体をファイルに書き込む代わりに、ゼロ以外の要素のみを書き込みます(もちろん、各要素にそのインデックスを1つずつ書き込む必要があります)。この行列を書きたいとしましょう:

0 0 0 2
1 0 0 0
0 0 0 0
0 0 3 0
0 0 0 0

これをファイルに書き込むことができます:

0 3 2
1 0 1
3 2 3

各行で、最初の数値は行、2番目は列、3番目は格納された値です。

ファイルをテキストとして書き込んでいる場合は、バイナリ形式に切り替えることができます。テキストを書き込むときは、各桁に1バイトを使用します。バイナリでは、数値ごとに固定量のバイトを使用し、スペースや改行を表す必要はありません。

100 200 300テキスト形式を使用する場合、ファイルへの数値の書き込みには11バイトかかります。ただし、16ビット整数を3つ書き込む場合は、6バイトを使用して書き込むことができます。Pythonでは、バイナリファイルを開くために「wb」モードと「rb」モードを使用してから、それらをバイトとして書き込みます。

f = open('file', 'wb')
f.write('%c' % 123)
f.close()

または-より効率的に、

import array
f = open('file', 'wb')
data = array.array('B')
data.append(1)
data.append(2)
data.append(3)
data.tofile(f)
f.close()

それ以外の場合は、標準的な手法を使用して、データ構造を圧縮してみてください。質問にをタグ付けしたので、データ圧縮用pythonのこれらのPythonライブラリにおそらく興味があるでしょう。

データ圧縮についてもっと知りたい場合に備えて、理論的には少し重いデータ圧縮のこの素晴らしい紹介もあります。

于 2012-06-09T03:08:20.177 に答える
1

データは非常にまばらなので、SciPyPackages/Sparseを使用できます。I /Oについてはこれを見ることができます

スパース行列は、多数のゼロ値を持つ単純な行列です。

だから、自分でコードを書きたいのなら。保存するときはsparse matrix、ゼロ以外の要素の位置と要素値を出力するだけで済みます。例えば:

sparse matrix:_

1 0 0 1
0 0 0 0
0 0 5 0
0 0 0 10

ファイルに保存する必要のあるデータは次のとおりです。

0 0 1
0 3 1
2 2 5
3 3 10

栽培者の場合sparse matrix、このメソッドはデータを減らしてに保存することができますfile

そして、いつ使用するかは、データからdata file回復するだけです。original matrix

幸運を

于 2012-06-09T03:10:27.510 に答える