私はいつもバイナリ形式であると考えていました。TFRecordは人間が読めるCSVよりも少ない領域を消費します。しかし、私はそれらを比較しようとしたとき、私はそれが当てはまらないことを見た。私のTFRecordファイルがcsvよりもずっと大きいのはなぜですか?
たとえば、ここではnum_rows
ラベルのnum_rows X 10
行列を作成し、それをcsvとして保存します。私はTFRecorsに保存することで、同じ操作を行います。
import pandas as pd
import tensorflow as tf
from random import randint
num_rows = 1000000
df = pd.DataFrame([[randint(0,300) for r in xrange(10)] + [randint(0, 1)] for i in xrange(num_rows)])
df.to_csv("data/test.csv", index=False, header=False)
writer = tf.python_io.TFRecordWriter('data/test.bin')
for _, row in df.iterrows():
arr = list(row)
features, label = arr[:-1], arr[-1]
example = tf.train.Example(features=tf.train.Features(feature={
'features' : tf.train.Feature(int64_list=tf.train.Int64List(value=features)),
'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[label])),
}))
writer.write(example.SerializeToString())
writer.close()
は、それは、CSV(2秒VS 1分50秒)よりもバイナリファイルを作成する方法より多くの時間がかかるだけでなく、それはまた、ほぼ2倍以上を使用していますスペース(38Mb VS 67.7Mb)。
正しく行いますか?出力ファイルを小さくするにはどうすればいいですか(鋸TFRecordCompressionType)、他に何ができますか?はるかに大きなサイズの理由は何ですか?
int64型に関するビジェイさんのコメントには意味がありますが、それでもすべてを答えていません。私はcsvにデータを格納しているので、Int64は8バイトを消費します。整数の文字列表現は長さが8である必要があります。したがって、私はこれを行うとdf = pd.DataFrame([[randint(1000000,99999999) for r in xrange(10)] for i in xrange(num_rows)])
まだ若干大きなサイズを取得します。今それは90.9Mb VS 89.1Mbです。これに加えて、csvは、各整数の間のコンマごとに1バイトを格納します。
これは、実際にint32になっているときに、tfrecordsに書き込むときにint64で機能を保存するためですか? –
この種のことは意味がありますが、FloatListに変更するとファイルサイズは92Mbに増加します。浮動小数点数でfloat64を意味する場合、それは同じままでなければなりません。そうでなければ、2倍に減少します。同様の状況(より大きなサイズ)は文字列のためのものです。 –