Un moyen efficace de charger des lignes excel dans une database?

Nous disposons de grands files excel (jusqu'à 100k lignes avec jusqu'à 150 colonnes, environ 30% des colonnes contenant des objects longs de text. La taille du file varie de 10mb à 60mb).

J'ai besoin de les charger dans notre database Oracle de la manière la plus efficace.

J'ai pensé à charger chaque file Excel avec xlrd , puis à créer une instruction INSERT pour chaque ligne Excel et à exécuter mon SQL avec cx_Oracle.

Mes questions sont –

  1. Dois-je créer une instruction INSERT pour chaque ligne, puis l'exécuter (ce qui signifie beaucoup d'appels cursor.execute (sql)), ou dois-je avoir une string massive avec tous mes inserts (séparés par un point-virgule), ce qui signifie que j'ai un seul appel cursor.execute (sql)?

  2. En supposant que l'set de l'opération prend beaucoup de time, est-il possible d'get un timeout d'attente dans la database? Je me souviens d'avoir quelque chose de similaire il y a quelque time, j'avais une très longue requête via cx_Oracle et, après quelques heures, il y avait un timeout d'attente et la connection était perdue. Que peut-on faire à ce sujet?

  3. Le concept est-il bon? Peut-être existe-t-il une meilleure façon de mettre en œuvre cela?

Merci!

    La réponse courte est que vous devez utiliser Cursor.prepare(statement[, tag]) et Cursor.executemany(statement, parameters) .

    La préparation de la déclaration à l'avance vous permet de recomstackr le même SQL INSERT encore et encore. Ne faites pas un encart par rangée, il sera lent.

    Executmany fait de nombreuses insertions d'un seul coup.

    Maintenant, il existe deux façons de base pour lesquelles vous pouvez aller – le dosage est une façon. Le problème avec le dosage est que vous devez concevoir l'approche par lots, choisir le numéro, etc. Les lots plus importants seront plus efficaces, mais vous devez considérer le compromis de la memory (vous ne pouvez probablement pas tout à la fois).

    Votre autre approche consiste à utiliser un générateur en python. C'est-à-dire créer une list paresseuse qui est générée au besoin. Vous pouvez effectivement créer une list de taille infinie en la générant comme consommée par executemany .

    Aussi, lisez la réponse à cette question relative aux inserts haute performance avec python / oracle.