Лучший способ записать кадры данных Python Pandas непосредственно в местоположение sftp - PullRequest
1 голос
/ 26 сентября 2019

У меня есть фрагмент кода на Python, который работает, но очень медленно пишет Dataframe непосредственно в местоположение SFTP.Я использую pysftp и pandas.to_csv () , чтобы выполнить задачу чтения файла Excel из удаленного местоположения, выполнить несколько простых преобразований и записать его в местоположение SFTP.

Ниже приведен фрагмент кода, который занимает ровно 4 минуты 30 секунд для записи 100 записей в местоположение SFTP.Средний обрабатываемый мной фрейм данных имеет максимум 20 столбцов.

'' '

def dataframe_sftp_transfer(df,destination_path):
    cnopts = CnOpts()
    cnopts.hostkeys = None
    sftp = Connection('sftp3.server.com'
                    ,username= 'user'
                    ,password = 'pwd123'
                    ,cnopts=cnopts)
    with sftp.open(destination_path,'w+') as f:
        chunksize = 100
        with tqdm(total=len(df)) as progbar:
            df.to_csv(f,sep='~',index=False,chunksize=chunksize)
            progbar.update(chunksize)

' ''

Существует ли лучший / более быстрый способ достижениявышесказанному?Разве написание файлов указанной величины не займет всего пару минут?

Использование такого инструмента, как FileZilla, для помещения файлов в удаленное местоположение SFTP работает намного быстрее, но, к сожалению, устраняет любые формы автоматизации.

1 Ответ

0 голосов
/ 26 сентября 2019

Вы открываете удаленный файл без буферизации.Таким образом, каждый раз, когда df.to_csv записывает в файл, Paramiko / pysftp отправляет запрос на SFTP-сервер и ожидает ответа.Я не знаю внутренности df.to_csv, но, скорее всего, она делает одну запись на строку (если не больше).Это объясняет, почему загрузка происходит так медленно.В частности, если ваше соединение с сервером имеет высокую задержку.

Чтобы включить буферизованные записи, используйте параметр bufsize из Connection.open:

with sftp.open(destination_path, 'w+', 32768) as f:

Обязательное предупреждение: не устанавливайте cnopts.hostkeys = None, если вы не заботитесь о безопасности.Для правильного решения см. Проверка ключа хоста с помощью pysftp .

...