Эффективный способ чтения файла SAS с более чем 100 миллионами строк в pandas

#python #pandas #sas

Вопрос:

У меня есть файл SAS, который содержит примерно 112 миллионов строк. На самом деле у меня нет доступа к программному обеспечению SAS, поэтому мне нужно поместить эти данные, предпочтительно, в фрейм данных pandas или что-то очень похожее в семействе python. Я просто не знаю, как это сделать эффективно. т. е. просто выполнение df = pd.read_sas(filename.sas7bdat) занимает несколько часов. Я могу сделать размеры кусков, но это на самом деле не решает основную проблему. Есть ли какой-нибудь более быстрый способ передать это пандам, или мне просто нужно съесть многочасовое ожидание? Кроме того, даже когда я прочитал файл, я почти ничего не могу с ним сделать, потому что повторение df также занимает целую вечность. Обычно это просто приводит к сбою ядра Jupyter. Заранее спасибо за любые советы в этом отношении!

Ответ №1:

Что касается первой части, я думаю, что здесь не так много нужно сделать, поскольку read_sas возможности ограничены.

Для второй части 1. повторение вручную по строкам медленно, а не философия панд. По возможности используйте векторные операции. 2. Попробуйте изучить специализированные решения для больших наборов данных, такие как dask. Также прочитайте, как масштабироваться до больших массивов данных.

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

1. Ценю ваш ответ. Знаете ли вы о том, как хранить pandas df для повторного использования? В принципе, мне не нужно читать один и тот же массивный файл каждый раз, когда я перезапускаю ядро, и я мог бы просто подготовить df к работе. Спасибо

2. Я никогда не сравнивал себя, но вы можете прочитать это

Ответ №2:

Возможно, вам не нужен весь ваш файл, чтобы работать над ним, поэтому вы можете взять 10%. Вы также можете изменить типы переменных, чтобы уменьшить объем их памяти.

  • если вы хотите сохранить df и повторно использовать его вместо повторного импорта всего файла каждый раз, когда вы хотите работать с ним, вы можете сохранить его как файл рассола (.pkl) и повторно открыть его с помощью pandas.read_pickle