Как прочитать большой CSV с помощью pandas?

#python #dataframe #out-of-memory

#python #фрейм данных #нехватка памяти

Вопрос:

Я загружаю файл rdx ( csv подобного формата) объемом около 16 ГБ в виде фрейма данных pandas, а затем сокращаю его, удаляя некоторые строки. Вот код:

 import pandas as pd

t_min, t_max, n_min, n_max, c_min, c_max = raw_input('t_min, t_max, n_min, n_max, c_min, c_max: ').split(' ')

data=pd.read_csv('/Users/me/Desktop/foo.rdx',header=None)

new_data=data.loc[(data[0] >= float(t_min)) amp; (data[0] <= float(t_max)) amp; (data[1] >= float(n_min)) amp; (data[1] <= float(n_max)) amp; (data[2] >= float(c_min)) amp; (data[2] <= float(c_max))]
  

Этот код работает для файлов меньшего размера (~ 5 ГБ), но, похоже, он не может загрузить файл такого размера. Есть ли обходной путь для этого? Или, может быть, способ сделать это с помощью bash-скрипта?

Любая помощь или предложение приветствуются.

Ответ №1:

Попробуйте использовать chunksize параметр, отфильтруйте фрагменты, а затем concat

 t_min, t_max, n_min, n_max, c_min, c_max = map(float, raw_input('t_min, t_max, n_min, n_max, c_min, c_max: ').split())

num_of_rows = 1024
TextFileReader = pd.read_csv(path, header=None, chunksize=num_of_rows)

dfs = []
for chunk_df in TextFileReader:
    dfs.append(chunk_df.loc[(chunk_df[0] >= t_min) amp; (chunk_df[0] <= t_max) amp; (chunk_df[1] >= n_min) amp; (chunk_df[1] <= n_max) amp; (chunk_df[2] >= c_min) amp; (chunk_df[2] <= c_max)])

df = pd.concat(dfs,sort=False)
  

Комментарии:

1. Да, это работает. Спасибо. Есть какая-нибудь причина, почему num_of_rows = 1024 а не 1K или 1M, например? Будет ли это быстрее или медленнее, если я увеличу chunksize ?

2. Нет, вы можете настроить его в соответствии с ограничениями вашего компьютера