如何在RNN TensorFlow中使用非常大的数据集?

时间:2017-07-25 09:19:53

标签: pandas machine-learning tensorflow dataset data-processing

我有一个非常大的数据集:7.9 GB的CSV文件。其中80%作为训练数据,其余20%作为试验数据。当我加载训练数据(6.2 GB)时,我在第80次迭代(第8​​0次文件)时有MemoryError。这是我在加载数据时使用的脚本:

import pandas as pd
import os

col_names = ['duration', 'service', 'src_bytes', 'dest_bytes', 'count', 'same_srv_rate',
        'serror_rate', 'srv_serror_rate', 'dst_host_count', 'dst_host_srv_count',
        'dst_host_same_src_port_rate', 'dst_host_serror_rate', 'dst_host_srv_serror_rate',
        'flag', 'ids_detection', 'malware_detection', 'ashula_detection', 'label', 'src_ip_add',
        'src_port_num', 'dst_ip_add', 'dst_port_num', 'start_time', 'protocol']

# create a list to store the filenames
files = []

# create a dataframe to store the contents of CSV files
df = pd.DataFrame()

# get the filenames in the specified PATH
for (dirpath, dirnames, filenames) in os.walk(path):
    ''' Append to the list the filenames under the subdirectories of the <path> '''
    files.extend(os.path.join(dirpath, filename) for filename in filenames)

for file in files:
    df = df.append(pd.read_csv(filepath_or_buffer=file, names=col_names, engine='python'))
    print('Appending file : {file}'.format(file=files[index]))

pd.set_option('display.max_colwidth', -1)
print(df)

6.2 GB的CSV文件中有130个文件。

3 个答案:

答案 0 :(得分:4)

对于大型数据集 - 我们可能已经计算了6.2GB这么大 - 一次读取所有数据可能不是最好的主意。无论如何,当你要批量训练你的网络时,仅加载下一个将要使用的批次所需的数据就足够了。

tensorflow documentation提供了有关如何实现数据读取管道的良好概述。根据文档链接的阶段是:

  
      
  1. 文件名列表
  2.   
  3. 可选文件名随机播放
  4.   
  5. 可选的纪元限制
  6.   
  7. 文件名队列
  8.   
  9. 文件格式的阅读器
  10.   
  11. 阅读器读取记录的解码器
  12.   
  13. 可选预处理
  14.   
  15. 示例队列
  16.   

答案 1 :(得分:3)

我是第二个Nyps的答案,我还没有足够的声誉来添加评论。此外,您可能会感兴趣的是打开任务管理器或等效的,并在运行时观察系统的已用内存。我猜想当你的RAM完全填满时,那是你收到错误的时候。

TensorFlow支持队列,这些队列只允许您一次读取部分数据,以免耗尽内存。这方面的例子是Nyps链接的文档。此外,TensorFlow最近添加了一种处理tf.contrib.data.Dataset中输入数据集的新方法。

此外,我建议将所有数据转换为TensorFlow的TFRecord格式,因为它可以节省空间,并且与在培训时将CSV文件转换为张量相比,可以加快数据访问速度100倍。

祝你好运:)

答案 2 :(得分:1)

我认为您需要将每个df附加到所有DataFrames的列表中,然后只使用concat一次:

dfs = []
for file in files:
    dfs.append(pd.read_csv(filepath_or_buffer=file, names=col_names, engine='python'))
    print('Appending file : {file}'.format(file=files[index]))

df = pd.concat(dfs, ignore_index=True)