私は弱い配列を読み書きするためにpickleライブラリを使用してきましたが、それらは非常に大きくなる傾向があります。より良い方法があるかどうかを調べるために、thisページ(図表のもの)のMarkの答えが見つかりました。基本的には、バイナリファイルとして保存することは、最速で読み書きが可能であるだけでなく、最小のメモリ量を占めるように見えます。だから私はhis github linkをクリックし、96行目で彼がndarraysを保存するために使うコードを見つけました。彼のコードは次のとおりです。誰かがこのコードで何が起きているのかをバイナリファイルとして保存することができますか?
class Binary(TimeArrStorage):
def save(self, arr, pth):
with open(pth, 'wb+') as fh:
fh.write(b'{0:s} {1:d} {2:d}\n'.format(arr.dtype, *arr.shape))
fh.write(arr.data)
sync(fh)
def load(self, pth):
with open(pth, 'rb') as fh:
dtype, w, h = str(fh.readline()).split()
return frombuffer(fh.read(), dtype=dtype).reshape((int(w), int(h)))
私の具体的な質問があり、fh.writeする最初の呼び出しに渡された文字列の意味は何ですか?前の "b"はバイナリを意味すると仮定しますが、{0:s} {1:d} {2:d}はどうでしょう。 2番目の質問は、このメソッドを任意のデータ型のndarrayに使用できるかどうかです。 3番目の質問は、同期メソッドを呼び出す必要があるということです(メソッドはgithubページの一番上に定義されています)。そして、最後の質問は、arrがndarrayであり、基本的にデータの開始位置のメモリ位置である場合、arr.dataが返すものを調べました。このコードは、それが書きたいオブジェクトの最後に到達したことをどのようにして知っていますか?
'.format'のpython3で導入された文字列フォーマット方法です。 '%'などの古い方法では 'np.save/load'は同じサイズのファイルを生成するはずです。彼らは形状とdtypeの情報(80バイトのようなもの)を格納するために固定サイズのprelimnaryバッファを使います。 – hpaulj