熊猫CSV阅读器:阅读时间随着行距的增加而增加

时间:2018-10-27 17:35:40

标签: python pandas csv bigdata

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

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

有什么方法可以处理大数据并跟踪以前的csv搜索会话?使用 chunksize 似乎是一个很好的解决方案,但不适用于其他大小的数据。

2 个答案:

答案 0 :(得分:0)

使用Python 3.7我看不到任何问题。我试图跳过100,000行

-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"

答案 1 :(得分:0)

  1. 确保块大小大于max seq len。由于需要使用填充,因此无论如何都需要对其进行计算。

  2. 保留最后一个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