2016-09-19 2 views
4

Я работаю над pandas dataframes. Цель моего приложения - выполнить определенный анализ в файле csv, и как только это будет сделано, вставьте этот файл csv в базу данных oracle.inserting pandas dataframe in oracle чрезвычайно медленный

Чтобы вставить в базу данных оракула, я использовал to_sql команду pandas. Но чтобы вставить 300 000 строк, мой код занял около 2 часов и десять минут. Однако, когда я использовал базу данных MySQL для того же анализа и того же размера входных данных, потребовалось всего 90 секунд.

Я делаю все свои операции внутри виртуальной машины lubuntu. Для справки вы можете найти соответствующий код ниже.

data_frame.to_sql(name='RSA_DATA', con=get_engine(), if_exists='append', 
          index=False, chunksize=config.CHUNK_SIZE) 
input_data_list = get_rsa_object_list(data_frame) 

Я же CHUNK_SIZE для обоих случаев (который был установлен в 500).

Может кто-нибудь сказать, что может быть причиной этого и как мне обойти это? Я не могу изменить свою систему баз данных с oracle в любую другую базу данных. Я использовал MySQL, чтобы быть уверенным, что проблема не связана с моим кодом.

Заранее спасибо.

Ниже приводится CREATE TABLE команда для Oracle базы данных:

CREATE TABLE "CRISDEV"."RSA_DATA" 
    ( "GENE_SYMBOL" VARCHAR2(50 BYTE), 
    "GENEID" NUMBER, 
    "CRISPR" VARCHAR2(75 BYTE), 
    "RSASCORE" NUMBER, 
    "LOGP" NUMBER, 
    "BEST_ACTIVITY" NUMBER, 
    "RSA_HIT" NUMBER, 
    "HIT_PER_GENE" NUMBER, 
    "TOTAL_CRISPRS" NUMBER, 
    "RSA_RANK" NUMBER, 
    "SAMPLE_NAME" VARCHAR2(10 BYTE), 
    "FOLD_CHANGE" NUMBER, 
    "EXPERIMENT_NUM" NUMBER, 
    "CELL_LINE" VARCHAR2(75 BYTE), 
    "CRISPR_LIB" VARCHAR2(75 BYTE), 
    "CRISPR_LOT" VARCHAR2(25 BYTE), 
    "CAS9_VENDOR" VARCHAR2(50 BYTE), 
    "CAS9_LOT" VARCHAR2(25 BYTE), 
    "CRISPR_INFECT_DATE" DATE, 
    "CAS9_INFECT_DATE" DATE, 
    "CAS9_MOI" NUMBER, 
    "FTE" VARCHAR2(50 BYTE), 
    "SAMPLE_NAME_LONG" VARCHAR2(150 BYTE), 
    "INDICATION" VARCHAR2(100 BYTE), 
    "LOW_CRISPR_COUNT" NUMBER DEFAULT 0, 
    "MODIFICATION" VARCHAR2(20 BYTE), 
    "TIMEPOINT" VARCHAR2(10 BYTE) 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_DATA" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_CELLLINE" ON "CRISDEV"."RSA_DATA" ("CELL_LINE") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_CRISPRLIB" ON "CRISDEV"."RSA_DATA" ("CRISPR_LIB") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_GENEID" ON "CRISDEV"."RSA_DATA" ("GENEID") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_GENESYMBOL" ON "CRISDEV"."RSA_DATA" ("GENE_SYMBOL") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_SAMPLELONG" ON "CRISDEV"."RSA_DATA" ("SAMPLE_NAME_LONG") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

    CREATE INDEX "CRISDEV"."C20150312_RSA_SAMPLENAME" ON "CRISDEV"."RSA_DATA" ("SAMPLE_NAME") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "CRISDEV_IDX" ; 

CREATE TABLE команда для MySQL выглядит следующим образом:

CREATE TABLE `RSA_DATA` (
    `GENE_SYMBOL` varchar(50) DEFAULT NULL, 
    `GENEID` int(11) DEFAULT NULL, 
    `CRISPR` varchar(75) DEFAULT NULL, 
    `RSASCORE` float DEFAULT NULL, 
    `LOGP` float DEFAULT NULL, 
    `BEST_ACTIVITY` float DEFAULT NULL, 
    `RSA_HIT` int(11) DEFAULT NULL, 
    `HIT_PER_GENE` int(11) DEFAULT NULL, 
    `TOTAL_CRISPRS` int(11) DEFAULT NULL, 
    `RSA_RANK` int(11) DEFAULT NULL, 
    `SAMPLE_NAME` varchar(10) DEFAULT NULL, 
    `FOLD_CHANGE` int(11) DEFAULT NULL, 
    `EXPERIMENT_NUM` int(11) DEFAULT NULL, 
    `CELL_LINE` varchar(75) DEFAULT NULL, 
    `CRISPR_LIB` varchar(75) DEFAULT NULL, 
    `CRISPR_LOT` varchar(25) DEFAULT NULL, 
    `CAS9_VENDOR` varchar(50) DEFAULT NULL, 
    `CAS9_LOT` varchar(25) DEFAULT NULL, 
    `CRISPR_INFECT_DATE` date DEFAULT NULL, 
    `CAS9_INFECT_DATE` date DEFAULT NULL, 
    `CAS9_MOI` int(11) DEFAULT NULL, 
    `FTE` varchar(50) DEFAULT NULL, 
    `SAMPLE_NAME_LONG` varchar(150) DEFAULT NULL, 
    `INDICATION` varchar(100) DEFAULT NULL, 
    `LOW_CRISPR_COUNT` int(11) DEFAULT NULL, 
    `MODIFICATION` varchar(20) DEFAULT NULL, 
    `TIMEPOINT` varchar(10) DEFAULT NULL 
); 
+0

Вы можете предоставить сценарии 'create table RSA_DATA ...' для Oracle и MySQL? Я подозреваю, что у вас есть некоторые индексы, триггеры и/или ограничения внешних ключей для этой таблицы ... – MaxU

+0

@MaxU: отредактировал мой ответ с соответствующей информацией. – Rajat

ответ

3

несколько комментариев на ваш вопрос:

  1. вы можете хотите поиграть с разными chunksize «s
  2. есть 6 индексов на стороне Oracle/Exadata, что, конечно, делает это медленнее
  3. Проверить, является ли занят ваш Exadata/перегружен делать что-то еще во время этой операции загрузки
  4. Вы можете попытаться загрузить ваш данных во временную таблицу, а затем скопируйте их в таблицу назначения. Если у вас нет [data guard/standby/streams/golden gate], вы также можете использовать прямую загрузку (nologging): insert /*+APPEND*/ into ...
  5. Я бы проанализировал события ожидания (со стороны Oracle) во время этого чтобы увидеть, где вы потратили самое время
+0

Спасибо за ваш быстрый ответ. Я пробовал использовать разные «chunksize», а именно 50, 500 и 1000. Время было почти сопоставимо во всех трех случаях. Кроме того, я попытался вставить в таблицу без индексов: я создал таблицу в Oracle без предоставления какого-либо индекса и попытался вставить в нее. Это заняло столько же времени на этом столе. – Rajat

+0

@ Раджат, я бы попробовал что-то вроде «10000, 20000, 50000 и т. Д.» – MaxU

+0

в порядке. позвольте мне попробовать. – Rajat

Смежные вопросы