Открытие CSV с одной строкой значений 6M очень медленно в пандах - PullRequest
0 голосов
/ 07 ноября 2018

Привет! У меня есть файл с приблизительно 6M значениями, разделенными запятыми, в одной строке

Я пытаюсь

import pandas as pd
v = pd.read_csv(file_name,
    nrows=1, skiprows=3, header=None, verbose=True, dtype=np.float32)

с файлом

Name
Tue Nov  6 13:52:15 2018 
Description
52.2269,52.2148,52.246,52.361,52.5263,52.7399,52.9738,53.1952,...45.4,

Я получаю вывод

Токенизация заняла: 0,00 мс

Преобразование типа заняло: 53023,43 мс

Очистка памяти анализатора заняла: 212,13 мс

В сводных шоу

1 rows × 6316057 columns

Время чтения файла занимает намного больше времени, чем ожидалось, я думаю, это может быть связано с тем, что данные находятся в одной строке. Могу ли я что-нибудь сделать, чтобы ускорить его, или мне нужна другая библиотека?

1 Ответ

0 голосов
/ 07 ноября 2018

Для моего времени ниже, некоторые фиктивные данные:

data = np.random.randn(1_000_000)    
with open('tmp', 'wt') as f:
    f.write('dummy\n')
    f.write('dummy\n')
    f.write('dummy\n')
    for val in data:
        f.write(str(val) + ',')
    f.write('\n')

В общем, анализатор pandas оптимизирован для «длинного» случая данных, а не для одной очень широкой строки, подобной этой. Вы можете предварительно обработать данные, превратив разделитель в новые строки, что для моего примера примерно в 40 раз быстрее.

def parse_wide_to_long(f):
    from io import StringIO
    data = open(f).read().splitlines()[-1]
    data = data.replace(',', '\n')
    return pd.read_csv(StringIO(data), header=None)


In [33]: %timeit pd.read_csv('tmp', nrows=1, skiprows=3, header=None, dtype=np.float32)
20.6 s ± 2.04 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [39]: %timeit parse_wide_to_long('tmp')
484 ms ± 35.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...