Я пытаюсь прочитать файл CSV, содержащий переменное число столбцов и рядов, чтобы вычислить (минимальное, максимальное, среднее, 75/95 квантиль) значения для каждого столбца. Количество столбцов очень большое (более 10 000 столбцов, может go до 100 000 столбцов или более в зависимости от конфигурации эксперимента). Типичное количество строк может составлять 3000 образцов. Типичный размер CSV составляет 700 МБ.
Что я знаю о наборе данных:
- Первый столбец - это тип даты
- Положение и название других столбцов отличаются от data-set to data-set и неизвестны на момент загрузки данных.
- Данные во всех столбцах, кроме первого, имеют тип int64 или float64.
- Я могу применить некоторая эвристика для определения типа данных некоторых, но не всех столбцов по их именам.
Моим главным узким местом для анализа является загрузка набора данных с использованием pandas read_csv
. После того, как набор данных был загружен в кадр данных, остальная часть вычислений очень быстрая.
Если бы я вычислял только минимальные, максимальные и средние значения, я мог бы прочитать набор данных по частям и попытаться ускорить read_csv
часть. Однако, чтобы определить различные квантили, я считаю, что весь столбец должен быть считан в фрейм данных.
Как я могу ускорить фазу загрузки данных
- Могу ли я указать некоторые, но не все столбцы в аргументе dtype для
read_csv
. Способствует ли это ускорению чтения CSV. Если так, то почему?
Я обнаружил, что это действительно способствует ускорению. Похоже, Pandas тратит много времени на определение типа данных. Я создал словарь dtype, используя некоторые эвристики для имени столбца. Предоставив аргумент dtype в readCSV, количество вызовов функций для определения типа уменьшилось, что привело к небольшому ускорению. Это также видно из профиля.
Профиль до оптимизации
Профиль после оптимизации
Существуют ли другие способы оптимизации, основанные на том, что я знаю о данных, которые я могу использовать для более быстрой загрузки?