Pandas CSV 阅读器:阅读时间随着跳跃而增加

Posted

技术标签:

【中文标题】Pandas CSV 阅读器:阅读时间随着跳跃而增加【英文标题】:Pandas CSV reader: read time increases with skiprows 【发布时间】:2018-10-27 17:35:39 【问题描述】:

我正在处理一个大型的顺序数据数据集,其长度可能不同。

目前使用pd.read_csv(series_file, skiprows=..., nrows=...),它适用于小型数据集,但当 skiprows 参数变大时会发疯。

是否有任何方法可以处理大数据并跟踪以前的 csv 搜索会话?使用 chunksize 似乎是一个不错的解决方案,但它不适用于不同大小的数据。

【问题讨论】:

【参考方案1】:

使用 Python 3.7 我没有发现任何问题。我试图跳过 100,000 行

import pandas as pd
path = r'C:\Temp\tmp.csv'
trg = open(path, 'w')
trg.write('col1,col2\n')
for i in range(10**6):
    trg.write('0,1\n'.format(i, i*2))
trg.close()
df = pd.read_csv(path, skiprows=10**5, nrows=30)

【讨论】:

当有 453,653,104 行时,它很快就会成为问题【参考方案2】:

    确保您的块大小大于 max seq len。由于您需要使用填充,因此您无论如何都需要计算它。

    保留最后一个 seq 组并将其附加到下一批中的第一个或仅与该批合并

我的最终解决方案是:

class PreSeqDataset(Dataset):
def __init__(self, max_seq_len, ch_size, series_file):
    self.max_seq_len = max_seq_len
    self.series_file = series_file
    self.ch_size = ch_size

def process_series_batch(self, series):
    ...
    return series


def __iter__(self):

    last_batch = None

    for chunk in pd.read_csv(self.series_file, chunksize=self.ch_size):

        series_batch = None

        ids = chunk['object_id'].unique()


        if last_batch is not None:
            if last_batch[0] in ids:
                chunk = chunk.append(last_batch[1])
            else:
                ids = list(ids)
                ids.insert(0, last_batch[0])
                series_batch = self.process_series_batch(last_batch[1])

        for i in ids[:-1]:
            series = chunk.loc[chunk[chunk.columns[0]] == i]
            series = self.process_series_batch(series)
            if series_batch is None:
                series_batch = series
            else:
                series_batch = torch.cat((series_batch, series))
        last_batch = (ids[-1], chunk.loc[chunk[chunk.columns[0]] == ids[-1]])
        series_batch = series_batch.to(device)
        yield ids[:-1], series_batch

【讨论】:

以上是关于Pandas CSV 阅读器:阅读时间随着跳跃而增加的主要内容,如果未能解决你的问题,请参考以下文章

read_csv() 中的 S3 阅读器是先将文件下载到磁盘还是使用流式传输?

对于循环不适用于 pandas.read_csv

如何在使用 pandas 读取 csv 文件时删除特定列?

为啥 Pandas 在 read_csv 时会导致 ZeroDivisionError

如何阅读pyspark中的特定列?

如何读取非常大的 CSV 的一小部分行。 Pandas - 时间序列 - 大型数据集