2017-05-16 1 views
0

Dans le fichier JSON, il existe environ 100 000 enregistrements. Je tente d'écrire tous dans l'entité mantle.product.Product.Importation de plus de 100 000 enregistrements à partir d'un JSON - accès lent à AT_ENTITY

La procédure commence et à environ 35000 enregistrements, il commence à se détériorer avec l'avertissement 'Slow hit à AT_ENTITY: create: mantle.product.Product'. Ensuite, il s'arrête définitivement avec 'java.lang.OutOfMemoryError: GC overhead limite dépassé' erreur. Ce comportement est sur mon PC.

Tous les conseils sont les bienvenus.

Voici le code:

void processJson2(String filePath) { 
    //def json = new JsonSlurper().parseText(new BufferedReader(new InputStreamReader(this.getFileIO().openStream(), "UTF-8"))) 

    //will initialize class manually 
    def docReadReference = this.executionContext.resource.getLocationReference(filePath) 

    if (docReadReference.isFile()) { 
     //inputstream 
     InputStream inputFile = docReadReference.openStream() 
     TransactionFacade trxFacade = this.executionContext.getTransaction() 

     this.executionContext.artifactExecution.disableTarpit() 
     this.executionContext.artifactExecution.disableEntityEca() 
     this.executionContext.artifactExecution.disableAuthz() 

     trxFacade.runRequireNew(50000, "Error loading entity JSON data", { 

      try { 
       logMachine.info("Opening file ${docReadReference.isFile()}") 

       JsonSlurper slurper = new JsonSlurper().setType(JsonParserType.CHARACTER_SOURCE) 
       def json = slurper.parse(new BufferedReader(new InputStreamReader(inputFile, "UTF-8"))) 

       //writer 
       Long counter = 1 

       json.each { 
        this.executionContext.service.sync().name("create", "mantle.product.Product").parameters([productId: it.sourceFileReference]).call() 

        //display thousands 
        if (counter % 1000 == 0) { 
         logMachine.info("JSON rows processed ${counter} > ${it.sourceFileReference}") 
        } 

        //move counter 
        counter += 1 
       } 

       //log 
       logMachine.info("File processed.") 

      } catch (Throwable t) { 
       trxFacade.rollback("Error while processing JSON", t); 

       //log as warning 
       logMachine.warn("Incorrectly handled JSON parsing ${t.message}.") 
      } finally { 
       if (trxFacade.isTransactionInPlace()) trxFacade.commit(); 

       inputFile.close() 

       this.executionContext.artifactExecution.enableTarpit() 
       this.executionContext.artifactExecution.enableEntityEca() 
       this.executionContext.artifactExecution.enableAuthz() 
      } 
     }) 
    } 
} 

Répondre

0

Cela semble fonctionner très bien, donc si quelqu'un a des problèmes similaires, il peut aider.

  1. depuis, j'utilisais MoquiDevConf, première chose à résoudre le problème lent touché est d'enlever le pour le type AT_ENTITY,
  2. chose suivante, la BufferedReader n'est pas la solution la plus efficace pour lire les données, je utilisé le InputStream pour initialiser le json ArrayList.

Ceci est le résultat:

InputStream inputFile = docReadReference.openStream() 
     TransactionFacade trxFacade = this.executionContext.getTransaction() 


     JsonSlurper slurper = new JsonSlurper().setType(JsonParserType.INDEX_OVERLAY) 
     //ArrayList<Object> json = slurper.parse(new BufferedReader(new InputStreamReader(inputFile, "UTF-8"))) 
     ArrayList<Object> json = slurper.parse(inputFile)