Pandas CSV Reader: время чтения увеличивается со скипроу - PullRequest
0 голосов
/ 27 октября 2018

Я работаю с большим набором последовательных данных, длина которых может отличаться.

В настоящее время используется pd.read_csv(series_file, skiprows=..., nrows=...), и он работает с небольшими наборами данных, но сходит с ума, когда аргумент skiprows становится больше.

Существуют ли способы работы с большими данными и отслеживания предыдущего сеанса поиска csv? Использование chunksize кажется хорошим решением, но оно не работает с данными другого размера.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018
  1. Убедитесь, что размер вашего чанка превышает максимально допустимый.Поскольку вам необходимо использовать отступы, вам все равно нужно его вычислить.

  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
0 голосов
/ 27 октября 2018

с использованием 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...