pandas.read_csv медленный при чтении файла со строкой переменной длины - PullRequest
0 голосов
/ 22 января 2019

У меня есть проблема, которую, я думаю, я несколько решил, но я хотел бы узнать о ней больше или узнать о лучших решениях.

Проблема: у меня есть файлы с разделителями табуляции с ~ 600k строками (и один комментарийстрока), одно из которых (из 8 полей) содержит строку переменной длины, от 1 до 2000 символов.

Чтение этого файла с помощью следующей функции ужасно медленное:

df = pd.read_csv(tgfile,
                 sep="\t",
                 comment='#',
                 header=None,
                 names=list_of_names)

Однако, возможно, меня не очень заботит большая часть строки (имя поля этой строки 'motif'), и я согласен с ее усечением, если она слишком длинная, используя:

def truncate_motif(motif):
    if len(motif) > 8:
        return motif[:8] + '~'
    else:
        return motif

df = pd.read_csv(tgfile,
                 sep="\t",
                 comment='#',
                 header=None,
                 converters={'motif': truncate_motif},
                 names=list_of_names)

Это внезапно намного быстрее.

Итак, мои вопросы:

  1. Почему чтение этого файла происходит так медленно?Связано ли это с выделением памяти?
  2. Почему здесь помогает функция конвертера?Он должен выполнять дополнительную функцию для каждой строки, но все еще намного быстрее ...
  3. Что еще можно сделать?

1 Ответ

0 голосов
/ 22 января 2019
  1. Вы не упомянули, что означает медленный для вас, но если:
    • Ваш файл содержит ок. 600 тыс. Строк,
    • каждая строка содержит 1-2000 символов (скажем, в среднем 1000, то есть каждая строка имеет около 1000B),

тогда размер этого файла: 600 000 * 1000B ~ 570 МБ. Это много, особенно если у вас мало оперативной памяти.

  1. Это помогает, потому что неожиданно средний размер одной строки становится не 1000В, а ок. 6-7В (учитывая новый максимум = 8В). Система не читает и не сохраняет целые строки, а только проверяет их длину и обрезает, если это необходимо. Звучит логика для меня!

  2. В таких случаях, когда вам нужно загрузить много данных, полезно использовать chunks .

for chunk in pd.read_csv(tgfile, chunksize=10000): process(chunk)

Параметр chunksize сообщает, сколько строк содержит один блок. Хорошо проверить, улучшает ли это производительность в вашем случае!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...