我一直认为作为二进制格式,TFRecord https://www.tensorflow.org/api_guides/python/python_io#tfrecords_format_details与人类可读的 csv 相比,占用的空间更少。但当我尝试比较它们时,我发现事实并非如此。
例如我在这里创建一个num_rows X 10
矩阵与num_rows
标签并将其另存为 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)。
我做得正确吗?如何使输出文件更小(锯TFRecord压缩类型 https://www.tensorflow.org/api_docs/python/tf/python_io/TFRecordCompressionType),但是我还能做些什么吗?尺寸更大的原因是什么?
Vijay 对 int64 的评论有道理,但仍然不能回答所有问题。 Int64 消耗 8 个字节,因为我将数据存储在 csv 中,整数的字符串表示形式的长度应该是 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 个字节。