Самый быстрый способ чтения больших файлов текстовых файлов в Pandas Dataframe - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть несколько больших файлов (> 4 ГБ каждый). Некоторые из них имеют формат с фиксированной шириной, а некоторые - с разделителями. Файлы имеют как цифры c, так и текстовые данные. В настоящее время я использую следующий подход:

df1 = pd.read_fwf(fwFileName, widths = [2, 3, 5, 2, 16], 
                 names = columnNames, dtype = columnTypes,
                 skiprows = 1, engine = 'c', 
                 keep_default_na = False)
df2 = pd.read_csv(pdFileName, sep = '|', names = columnNames, 
                 dtype = columnTypes, useCols = colNumbers, 
                 skiprows = 1, engine = 'c', 
                 keep_default_na = False)

Однако, это, кажется, медленнее, чем, например, read_fwf R (из readr) и Fread (из data.table). Могу ли я использовать другие методы, которые помогут ускорить чтение этих файлов?

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

Обновление

Основываясь на комментариях, пока Несколько дополнительных подробностей о данных и моей конечной цели.

  • Эти файлы сжаты (фиксированная ширина - zip, а разделитель трубы - gzip). Поэтому я не уверен, что такие вещи, как Dask, добавят ценность для загрузки. Будут ли они?
  • После загрузки этих файлов я планирую применить вычислительно дорогую функцию к группам данных. Поэтому мне нужны все данные. Хотя данные отсортированы по группам, т.е. первые x строк - это группа 1, следующие y строк - это группа 2 и т. Д. Поэтому формирование групп на лету может быть более продуктивным? Есть ли эффективный способ сделать это, учитывая, что я не знаю, сколько строк ожидать для каждой группы?

1 Ответ

0 голосов
/ 14 апреля 2020

Так как здесь мы берем время как метрику c, то размер вашей памяти не является основным фактором, на который мы должны обратить внимание, напротив, все методы, использующие отложенную загрузку (меньше памяти и загружают объекты только при необходимости) намного быстрее, чем загрузка всех данных одновременно в память, вы можете проверить dask, поскольку он обеспечивает такую ​​функцию отложенного чтения. https://dask.org/

start_time = time.time() 
data = dask.dataframe.read_csv('rg.csv') 
duration = time.time() - start_time
print(f"Time taken {duration} seconds") # less than a second

Но, как я уже сказал, это не будет загружать данные в память, а будет загружать только части данных при необходимости, однако вы можете загрузить их полностью, используя:

data.compute()

Если вы хотите быстрее загружать данные в память, вам необходимо иметь хорошие вычислительные возможности на своем сервере, хорошим кандидатом, который может извлечь выгоду из таких возможностей, является ParaText https://github.com/wiseio/paratext Вы можете сравнить ParaText с readcsv, используя следующий код:

import time
import paratext
start_time = time.time() 
df = paratext.load_csv_to_pandas("rg.csv") 
duration = time.time() - start_time
print(f"Time taken {duration} seconds")   
import time
import pandas as pd
start_time = time.time() 
df = pd.read_csv("rg.csv") 
duration = time.time() - start_time
print(f"Time taken {duration} seconds")   

Обратите внимание, что результаты могут быть хуже, если у вас недостаточно вычислительной мощности для поддержки paraText. Вы можете проверить тесты для ParaText загрузки больших файлов здесь https://deads.gitbooks.io/paratext-bench/content/results_csv_throughput.html.

...