Как загрузить огромный Oracle LOB с помощью cx_Oracle на ограниченную памятью систему?

Я разрабатываю часть системы, в которой процессы ограничены примерно 350 МБ ОЗУ; мы используем cx_Oracle для загрузки файлов из внешней системы для обработки.

Внешняя система хранит файлы как BLOB, и мы можем захватить их, делая что-то вроде этого:

# ... set up Oracle connection, then cursor.execute(u"""SELECT filename, data, filesize FROM FILEDATA WHERE ID = :id""", id=the_one_you_wanted) filename, lob, filesize = cursor.fetchone() with open(filename, "w") as the_file: the_file.write(lob.read()) 

lob.read() , очевидно, потерпит неудачу с MemoryError когда мы MemoryError файл размером более 300-350 МБ, поэтому мы попробовали что-то вроде этого, вместо того, чтобы читать все сразу:

 read_size = 0 chunk_size = lob.getchunksize() * 100 while read_size < filesize: data = lob.read(chunk_size, read_size + 1) read_size += len(data) the_file.write(data) 

К сожалению, мы по-прежнему получаем MemoryError после нескольких итераций. С момента lob.read() и состояния из-за памяти, которое мы в конечном итоге получаем, похоже, что lob.read() каждый раз вытягивает байты (chunk_size + read_size) из базы данных. То есть, чтение принимает O (n) время и O (n) память, хотя буфер немного меньше.

Чтобы обойти это, мы пробовали что-то вроде:

 read_size = 0 while read_size < filesize: q = u'''SELECT dbms_lob.substr(data, 2000, %s) FROM FILEDATA WHERE ID = :id''' % (read_bytes + 1) cursor.execute(q, id=filedataid[0]) row = cursor.fetchone() read_bytes += len(row[0]) the_file.write(row[0]) 

Это затягивает 2000 байт (argh) за раз и занимает навсегда (что-то вроде двух часов для 1,5-Гбайт файла). Почему 2000 байт? Согласно документам Oracle, dbms_lob.substr() сохраняет возвращаемое значение в RAW, которое ограничено 2000 байтами.

Есть ли способ сохранить результат dbms_lob.substr() в более крупном объекте данных и читать, может быть, несколько мегабайт за раз? Как это сделать с помощью cx_Oracle?

One Solution collect form web for “Как загрузить огромный Oracle LOB с помощью cx_Oracle на ограниченную памятью систему?”

Я думаю, что порядок аргументов в lob.read () в вашем коде изменился. Первым аргументом должен быть смещение, вторым аргументом должна быть сумма для чтения. Это объясняет использование O (n) времени и памяти.

  • Как установить cx_Oracle на El Capitan
  • Экспорт DataFrame в Oracle: TypeError
  • Как заставить Django подключаться к Oracle с использованием имени службы
  • Установка модуля pxon cx_Oracle в Windows и подключение к базе данных Oracle
  • cx_Oracle не подключается при использовании SID вместо имени службы в строке подключения
  • Как я могу заставить cx-oracle связывать результаты запроса со словарем, а не с кортежем?
  • Совместное использование соединения базы данных Oracle между одновременными задачами Celery
  • Как читать cx_Oracle.OBJECT с типом cx_Oracle.ObjectType SYS.XMLTYPE?
  •  
    Interesting Posts for Van-Lav

    Как ускорить сито из генератора списка питов эратосфена

    вопрос использования py2app setup.py

    Как использовать Python 3 (3.5) в качестве интерпретатора по умолчанию в моей виртуальной среде?

    Добавление настраиваемого JS в поле admin django

    Как переименовать файл с последовательностью, которая перезапускается, если существуют определенные соответствия

    Easy_install и pip сломались: pkg_resources.DistributionNotFound: распространять == 0.6.36

    Как использовать PyObject_IsInstance с не встроенным классом в качестве второго аргумента?

    Декодер Django @login_required перенаправляет людей в / accounts / login, когда они не зарегистрированы. Как изменить этот URL?

    Разница между zip (list) и zip (* list)

    Как понять символ равенства «=» в тексте электронной почты IMAP?

    Есть ли твердый метод для анализа вейвлетов в Python?

    ImportError: Нет модуля с именем 'util'

    Установка пакетов python в nitrousio

    Как я могу использовать Batch Normalization в TensorFlow?

    печатать значения словаря, которые находятся внутри списка в python

    Python - лучший язык программирования в мире.