Искать и вычислять общее количество записей в файле SAS7BDAT из Python исключительно с помощью инструментов с открытым исходным кодом - PullRequest
0 голосов
/ 19 мая 2018

У меня есть несколько файлов sas7dat, которые содержат сотни миллионов строк и находятся в диапазоне от 100 до 1000 ГБ.Я хотел бы иметь возможность эффективно выполнять следующие действия:

  1. Вычислить количество записей в файле.
  2. Искать запись n .

Есть ли способ сделать это с помощью интерфейса pandas.read_sas?Я хотел бы избежать использования самого SAS.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Нет способа эффективно прочитать файл и сделать то, что вы хотите сделать с pandas.Вот выход -

Используйте параметр chunksize в ваших интересах -

CHUNKSIZE = 1e6
rows = 0
for df in pd.read_sas('path/to/sas/filename.sas7bdat', chunksize=CHUNKSIZE, iterator=True):
    rows += df.shape[0]
    # whatever else you want

Пояснение

Это читает миллион строк ввремя (варьируйте chunksize в зависимости от того, сколько оперативной памяти вы можете себе позволить) и итеративно подсчитывает, что вы хотите.В качестве альтернативы вы можете использовать его для выполнения других операций df, если вы продолжаете их накапливать.

Предупреждение

На обычном аппаратном обеспечении, пытающемся прочитать ~100 ГБ, все еще будут неэффективными.

0 голосов
/ 21 мая 2018

Я нашел ответ!Но ответ заключается в том, чтобы не использовать панд, поэтому я изменил название.

Существует реализация с открытым исходным кодом SAS7BDAT для Apache Spark .(Это написано на Scala).«Этот формат можно разделить, когда вход распакован, поэтому можно добиться высокого параллелизма для большого файла SAS .... Благодаря разделяемой таблице SasInputFormat мы можем преобразовать файл .sas7bdat размером 200 ГБ (1,5 млрд. Строк) в файлы .csv, используя 2000исполнителей менее чем за 2 минуты. "

С этим кодом эффективный способ подсчета количества строк будет:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)
df = sqlContext.read.format("com.github.saurfang.sas.spark").load("input.sas7bdat")
print("Number of rows in input.sas7bdat: {}".format(df.count()))
0 голосов
/ 19 мая 2018

Считайте файл и используйте .shape, чтобы определить количество строк

import pandas as pd

df = pd.read_sas('filename.sas7bdat')
df.shape[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...