2016-09-07 11 views
0

J'ai cette situation:Optimize Script PHP pour insérer dans MongoDB

  • plus de fichier 2000 avec une structure fixe;
  • un fichier ont à peu près 200,000 ligne
  • pour moi chaque ligne est un document MongoDB (200,000 documents par fichier)

, j'ouvrir un fichier avec php et insérer un seul document dans MongoDB. Ensuite, le script insère environ 400.000.000 de document.

Mon script utilise 5 heures pour insérer environ 60 fichiers (12.000.000 document).

Ma question est: Est-il possible d'optimiser le script pour réduire le temps d'insertion? Je supprime l'index dans MongoDB pour plus d'insertion rapide; Je travaille dans local avec Wamp

SCRIPT:

<?php 
    // connect to mongodb 
    $m = new MongoClient(); 
    function spacePosition($stringa){ 
     $pos=0; 
     //substr(string,start,length) 
     $lunghezzaStringa = strlen($stringa); 
     while($pos<$lunghezzaStringa){ 

      if(substr($stringa,$pos,1)==" ") { 
       return $pos; 
      } else { 
       $pos=$pos+1; 
      } 

     } 

    } 

    //Funzione per inserire un Documento BED in MongoDB 
    function insertDocumentBed($document,&$m){ 
     // select a database 
     $db = $m->BRCA; 
     $collection = $db->bedCollection; 
     unset($document->_id); 
     $collection->insert($document); 
    } 

    //Fine Funzione per inserire un Documento BED in MongoDB 
    $directory = "D:/other/BRCA/dnamethylationTemp"; 
    $tumor="BRCA"; 
    $experiment="dnamethylation"; 

    if (is_dir($directory)) { 

     if ($directory_handle = opendir($directory)) { 
      while (($file = readdir($directory_handle)) !== false) { 

       if((!is_dir($file))&($file!=".")&($file!=".."))              $extension = pathinfo($file,PATHINFO_EXTENSION); 

       if(trim($extension)=="meta"){ 
        //...//      
       } 

       //FINE ESTRAZIONE DATI DA FILE .META 
      } 

      elseif(trim($extension)=="bed"){ 
       ini_set('max_execution_time', 0); 
       //0=NOLIMIT 
       $nuovaDirectory = $directory."/".$file; 
       $handle = fopen($nuovaDirectory, "r"); 
       $filename = basename($nuovaDirectory); 
       $patient_id = substr($filename,0,12); 
       $document1 = array('filename'=>$filename); 
       //init 

       if ($handle) { 
        while (($line = fgets($handle)) !== false) { 
         $row = preg_replace('/\s+/', ' ',$line); 
         $rowSplit = explode(" ", $row); 
         $chrom = $rowSplit[0]; 
         $chromStart = $rowSplit[1]; 
         $chromEnd = $rowSplit[2]; 
         $strand = $rowSplit[3]; 
         $composite_element_ref = $rowSplit[4]; 
         $beta_value = $rowSplit[5]; 
         $gene_symbol = $rowSplit[6]; 
         $document1["tumor"] = $tumor; 
         $document1["experiment"] = $experiment; 
         $document1["PATIENT_ID"] = $patient_id; 
         $document1["filename"] = $filename; 
         $document1["chrom"] = $chrom; 
         $document1["chromStart"] = (int)$chromStart; 
         $document1["chromEnd"] = (int)$chromEnd; 
         $document1["strand"] = $strand; 
         $document1["composite_element_ref"] = $composite_element_ref; 
         $document1["beta_value"] = (float)$beta_value; 
         $document1["gene_symbol"] = $gene_symbol; 
         insertDocumentBed($document1,$m); 
        } 

        fclose($handle); 
       } else { 
        // error opening the file. 
       } 

       // 
       //Fine Estrazione da File .BED 
      } 

     } 

     closedir($directory_handle); 
    } 

} 

$m->close(); 
?> 
+1

Quelle section de votre script est la partie lente? Je vois un 'preg_replace()' et regex est notoire pour rendre les choses lentes. – MonkeyZeus

+0

En outre, vous avez trop d'accolades de fermeture '}' donc votre script devrait échouer de toute façon ... – MonkeyZeus

+0

@MonkeyZeus désolé pour le morceau de code coupé, le script fonctionne. si possible joindre le fichier php je résous – mydb

Répondre

0

lot Insérer dans MongoDB pour plus de détails pour Click Here

+0

Je remplace Insert avec BatchInsert mais j'obtiens cette erreur: Erreur irrécupérable: Exception non interceptée 'MongoException' avec le message 'Aucune opération d'écriture n'a été incluse dans le lot' – mydb