如何加快简单的CSV数据集

时间:2019-03-05 21:05:19

标签: python tensorflow tensorflow-datasets

我正在尝试设置tf.data.Dataset以流传输大于内存的CSV文件以进行训练。我创建了以下基准,使用〜100mb CSV估算处理吞吐量(以mb / sec为单位)。

我要分批处理32个。理想情况下,我希望有一个解决方案,让我可以调整最小批量大小以进行训练,而不会影响数据集性能。

这是我的基准代码:

import os
import tensorflow as tf
import pandas as pd
import numpy as np
import time

input_file = 'playstore.csv'
batch = 32
headers = ['App', 'Category', 'Rating', 'Reviews', 'Size', 'Installs', 'Type', 'Price', 'Genres', 'Last Updated']


def get_dataset():

    def _parse_csv(text_in):
        defaults = [[''] for _ in headers]
        values = tf.decode_csv(text_in, defaults)
        values = [tf.reshape(x, (-1, 1)) for x in values]
        return dict(zip(headers, values))

    dataset = tf.data.TextLineDataset(input_file).skip(1)
    dataset = dataset.batch(batch)
    dataset = dataset.prefetch(1)
    dataset = dataset.map(_parse_csv, num_parallel_calls=8)
    return dataset


def run_benchmark(dataset):    
    # Get the whole dataset in one tensor
    dataset = dataset.take(1200000//batch)
    dataset = dataset.batch(10000000)
    next_element = dataset.make_one_shot_iterator().get_next()

    # Time it
    with tf.Session() as sess:
        tstart = time.time()
        sess.run(next_element['App'][0][0][0])
        t = time.time() - tstart

    mb = os.stat(input_file).st_size/1024/1024
    rate = mb / t
    print('time: {} seconds, speed: {} mb/sec'.format(t, rate))


run_benchmark(get_dataset())

这在我的Macbook上每秒产生约20mb / s。我可以增加批处理大小以获得更好的结果,但是,如果我将它与dataset.unbatch()。batch(x)链接起来以控制解析后的最终批处理大小,则总体速度会降低约50%。

有人可以告诉我:

  • 这是估计数据集吞吐量的合理方法吗?
  • 如何提高性能?

更新

  • pandas.read_csv()耗时1.59秒(61 mb /秒)
  • python csv.reader()耗时1.43秒(67 mb /秒)
  • 通过f.readlines()打开/循环需要0.37秒(262.16 mb /秒)
  • shutil.copy()耗时0.21秒(459.72 mb /秒)

0 个答案:

没有答案