2016-08-16 2 views
1

Je travaille actuellement sur un ArangoDB POC. Je trouve que le temps nécessaire à la création de documents est très élevé dans ArangoDB avec PyArango. Il faut environ 5 minutes pour insérer 300 documents. J'ai collé le code ci-dessous rugueux, s'il vous plaît laissez-moi savoir s'il y a de meilleures façons pour accélérer cette place:La meilleure façon d'importer des données en masse dans ArangoDB

with open('abc.csv') as fp: 
for line in fp: 
    dataList = line.split(",") 

    aaa = dbObj['aaa'].createDocument() 
    bbb = dbObj['bbb'].createDocument() 
    ccc = dbObj['ccc'].createEdge() 

    bbb['bbb'] = dataList[1] 
    aaa['aaa'] = dataList[0] 
    aaa._key = dataList[0] 

    aaa.save() 
    bbb.save() 

    ccc.links(aaa,bbb) 
    ccc['related_to'] = "gfdgf" 
    ccc['weight'] = 0 

    ccc.save() 

Les différentes collections sont créées par le code ci-dessous:

dbObj.createCollection(className='aaa', waitForSync=False) 
+1

Avez-vous envisagé [arangoimp] (https://docs.arangodb.com/3.0/Manual/Administration/Arangoimp.html)? Si nécessaire, vous pouvez pré-traiter vos données sources avec Python, mais l'importation elle-même doit être effectuée par arangoimp, qui utilise l'API d'importation en bloc d'ArangoDB pour plus d'efficacité. – CoDEmanX

+0

J'ai regardé dans l'arangoimp, Il semble que les données doivent être sous la forme de fichiers JSON, CSV avec des clés primaires déjà présents. Le problème que je vois ici est que je ne serai pas capable de gérer les nœuds en double, qui pourraient être déjà présents dans la base de données. Existe-t-il des options spécifiques pour gérer ces conditions, je ne trouve pas dans la documentation ArangoImp – pjesudhas

+0

pyArango a actuellement un problème avec HTTP 'keep-alive' - il ne réutilisera pas les connexions et donc refaire des recherches DNS. Nous étudions actuellement ce qui pourrait être la cause de cela et comment y remédier. – dothebart

Répondre

4

pour votre problème avec le mode de traitement par lots dans le pilote arango java. Si vous connaissez les attributs clés des sommets, vous pouvez construire le handle de document par "collectionName" + "/" + "documentKey". Exemple:

arangoDriver.startBatchMode(); 

for(String line : lines) 
{ 
    String[] data = line.split(","); 

    BaseDocument device = new BaseDocument(); 
    BaseDocument phyAddress = new BaseDocument(); 
    BaseDocument conn = new BaseDocument(); 

    String keyDevice = data[0]; 
    String handleDevice = "DeviceId/" + keyDevice; 

    device.setDocumentKey(keyDevice); 

    device.addAttribute("device_id",data[0]); 

    String keyPhyAddress = data[1]; 
    String handlePhyAddress = "PhysicalLocation/" + keyPhyAddress; 

    phyAddress.setDocumentKey(keyPhyAddress); 

    phyAddress.addAttribute("address",data[1]); 

    final DocumentEntity<BaseDocument> from = arangoDriver.graphCreateVertex("testGraph", "DeviceId", device, null);  
    final DocumentEntity<BaseDocument> to = arangoDriver.graphCreateVertex("testGraph", "PhysicalLocation", phyAddress, null); 

    arangoDriver.graphCreateEdge("testGraph", "DeviceId_PhysicalLocation", null, handleDevice, handlePhyAddress, null, null); 

} 
arangoDriver.executeBatch(); 
0

Je construirais toutes les données à insérer dans une chaîne au format json et utilisez createDocumentRaw pour les créer toutes en une seule fois avec une sauvegarde.