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 阅读器是先将文件下载到磁盘还是使用流式传输?