读取大型record格式数据为dataframe

如果数据非常大,读取速度较慢,可以采取以下几种优化策略来提升读取和处理速度:

  1. 使用多线程或多进程读取文件:可以使用TensorFlow的并行数据加载功能。
  2. 增加批处理大小:批量读取和处理数据。
  3. 减少内存占用:使用更高效的TensorFlow数据管道操作。
  4. 缓存数据:将数据缓存在内存或磁盘中,以便重复读取时速度更快。

下面是一个优化后的示例代码,结合上述策略:

优化示例代码

import tensorflow as tf
import pandas as pd
import dask.dataframe as dd

# 定义解析函数
def _parse_function(proto):
    # 定义解析的特征结构
    keys_to_features = {
        'feature1': tf.io.FixedLenFeature([], tf.int64),
        'feature2': tf.io.FixedLenFeature([], tf.float32),
        'feature3': tf.io.VarLenFeature(tf.float32),  # 解析列表
    }
    
    # 解析单个样本
    parsed_features = tf.io.parse_single_example(proto, keys_to_features)
    
    # 对VarLenFeature类型的特征进行处理
    parsed_features['feature3'] = tf.sparse.to_dense(parsed_features['feature3'])
    
    return parsed_features

# 读取文件列表
file_list = ['path/to/file1.tfrecord.gz', 'path/to/file2.tfrecord.gz', ...]

# 创建TFRecordDataset
dataset = tf.data.TFRecordDataset(file_list, compression_type='GZIP')

# 并行读取和解析数据
dataset = dataset.interleave(
    lambda x: tf.data.TFRecordDataset(x, compression_type='GZIP').map(_parse_function),
    cycle_length=4,   # 并行文件数,可以调整
    block_length=16   # 每次读取样本数,可以调整
)

# 批量处理数据,增加读取速度
dataset = dataset.batch(1024)

# 预取数据,加速读取
dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

# 缓存数据到内存或磁盘
dataset = dataset.cache()

# 将数据转换为pandas DataFrame
data = []
for batch in dataset:
    for parsed_record in batch:
        data.append({key: value.numpy() for key, value in parsed_record.items()})

df = pd.DataFrame(data)
print(df)

# 转换为Dask DataFrame
ddf = dd.from_pandas(pd.DataFrame(data), npartitions=10)
print(ddf.compute())

说明

  1. interleave方法:并行读取多个文件,可以设置cycle_length为并行读取的文件数,block_length为每次读取的样本数。
  2. batch方法:批量读取数据,每次读取1024条记录,可以根据内存大小调整。
  3. prefetch方法:预取数据,加速数据加载,buffer_size设置为tf.data.experimental.AUTOTUNE可以自动调整预取大小。
  4. cache方法:缓存数据,可以缓存在内存或磁盘中,加快后续读取速度。

通过这些优化措施,可以显著提升大规模TFRecord文件的读取和处理速度。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值