Извлечение огромных данных из Oracle в Python

Мне нужно получить огромные данные из Oracle (используя cx_oracle) в python 2.6 и создать файл csv.

Размер данных составляет около 400 тыс. записей x 200 столбцов x 100 символов в каждом.

Как лучше всего это сделать?

Теперь, используя следующий код...

ctemp = connection.cursor()
ctemp.execute(sql)
ctemp.arraysize = 256
for row in ctemp:
  file.write(row[1])
  ...

... сценарий остается в цикле часами, и в файл ничего не записывается... (есть ли способ распечатать сообщение для каждой извлеченной записи?)

Примечание. У меня нет проблем с Oracle, и выполнение запроса в SqlDeveloper выполняется очень быстро.

Спасибо, Джан


person Gianx    schedule 08.10.2013    source источник
comment
Есть ли способ распечатать сообщение... да, добавьте оператор печати в свой код...   -  person Andreas Jung    schedule 08.10.2013
comment
Есть ли в вашем коде file.flush() или что-то подобное?   -  person Colin 't Hart    schedule 08.10.2013


Ответы (3)


Вместо этого вы должны использовать cur.fetchmany(). Он будет извлекать фрагмент строк, определенных arraysise (256)

Код Python:

def chunks(cur): # 256
    global log, d
    while True:
        #log.info('Chunk size %s' %  cur.arraysize, extra=d)
        rows=cur.fetchmany()

        if not rows: break;
        yield rows

Затем выполните обработку в цикле for;

for i, chunk  in enumerate(chunks(cur)):
            for row in chunk:
                     #Process you rows here

Именно так я делаю это в своем TableHunter для Oracle.

person olekb    schedule 15.03.2017

  • добавить операторы печати после каждой строки
  • добавьте счетчик в свой цикл, указывающий прогресс после каждых N строк
  • загляните в модуль, например «прогрессбар», для отображения индикатора прогресса
person Andreas Jung    schedule 08.10.2013
comment
Вы слышали о pdb? Гораздо лучше, чем использовать print - person Paco; 08.10.2013

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

Пытаться:

ctemp = connection.cursor()
ctemp.execute(sql)
Results = ctemp.fetchall()
for row in Results:
    file.write(row[1])
person George    schedule 08.10.2013
comment
Сначала загрузить 800 мегабайт в память, а затем записать в файл? Мог бы работать, но я бы не хотел. - person Colin 't Hart; 08.10.2013