2010-07-17 10 views
2

Je souhaite analyser un fichier de 8 Go pour trouver des informations. Cela me prend plus de 4 heures pour finir. Je suis passé par Perl Parallel :: ForkManager module pour cela. Mais cela ne fait pas beaucoup de différence. Quelle est la meilleure façon de mettre en œuvre cela?Calcul parallèle en Perl

Ce qui suit est la partie du code utilisée pour analyser ce fichier Jumbo. J'ai en fait une liste de domaines dans lesquels je dois regarder dans un fichier de zone de 8 Go et savoir avec quelle compagnie il est hébergé.

unless(open(FH, $file)) { 
     print $LOG "Can't open '$file' $!"; 
     die "Can't open '$file' $!"; 
    } 

    ### Reading Zone file : $file 
    DOMAIN: while(my $line = <FH>){ 

     #domain and the dns with whom he currently hosted 
     my($domain, undef, $new_host) = split(/\s|\t/, $line); 
     next if $seen{$domain}; 
     $seen{$domain} =1; 

     $domain.=".$domain_type"; 
     $domain = lc ($domain); 


     #already in? 
     if($moved_domains->{$domain}){ 

      #Get the next domain if this on the same host, there is nothing to record 
      if($new_host eq $moved_domains->{$domain}->{PointingHost}){ 
       next DOMAIN; 
      } 
      #movedout 
      else{ 
       @INSERTS = ($domain, $data_date, $new_host, $moved_domains->{$domain}->{Host}); 
       log_this($data_date, $populate, @INSERTS); 
      } 
      delete $moved_domains->{$domain}; 
     } 
     #new to MovedDomain 
     else{ 
      #is this any of our interested HOSTS 
      my ($interested) = grep{$new_host =~/\b$_\b/i} keys %HOST; 

      #if not any of our interested DNS, NEXT! 
      next DOMAIN if not $interested; 
      @INSERTS = ($domain, $data_date, $new_host, $HOST{$interested}); 
      log_this($data_date, $populate, @INSERTS); 

     } 
     next DOMAIN; 

    } 
+3

Post le code que vous utilisez avec Parallel :: ForkManager. – Ether

+1

Code postal (et peut-être des données d'échantillon). il y a des chances que cela n'ait rien à voir avec le traitement parallèle. Je suis également curieux de savoir pourquoi cette 8G de données n'est pas dans une base de données. – xenoterracide

Répondre

4

Avec le peu d'informations que vous avez données: Parallel::ForkManager sonne comme un outil approprié. Mais vous obtiendrez probablement une meilleure aide si vous donnez plus de détails sur votre problème.

La parallélisation est toujours un problème difficile. Combien vous pouvez espérer gagner dépend beaucoup de la nature de la tâche. Par exemple, recherchez-vous une ligne spécifique dans le fichier? Ou un enregistrement spécifique de taille fixe? Ou tous les morceaux qui correspondent à un modèle de bits particulier? Traitez-vous le fichier du début à la fin, ou pouvez-vous ignorer certaines parties, ou faites-vous beaucoup de brassage d'avant en arrière?

Le fichier de 8 Go est également une contrainte absolue, ou pourriez-vous être en mesure de réorganiser les données pour faciliter la recherche d'informations?

Avec les vitesses que vous offrez, si vous parcourez le fichier une seule fois, les E/S ne sont pas le goulot d'étranglement, mais elles sont proches. Cela pourrait être le goulot d'étranglement si d'autres processus accèdent au disque en même temps. Cela peut valoir la peine d'affiner vos modèles d'accès au disque; cela dépendrait un peu de l'OS et du système de fichiers.

6

Une analyse syntaxique ligne par ligne de base à travers un fichier de 1 Go - par exemple, exécuter une regex ou quelque chose - ne prend que quelques minutes sur mon boîtier Windows de 5 ans. Même si le travail d'analyse est plus vaste, 4 heures semblent terriblement longues pour 8 Go de données. Etes-vous sûr que votre code n'a pas une inefficacité flagrante?

Est-ce que vous stockez beaucoup d'informations pendant l'analyse et le dépassement de vos limites de RAM? CPAN a des outils qui vous permettront de profiler votre code, notamment Devel::NYTProf. Avant de passer à travers les tracas de la parallélisation de votre code, assurez-vous de comprendre où se trouve le goulot d'étranglement . Si vous expliquez ce que vous faites ou, mieux encore, fournissez un code qui illustre le problème de manière compacte, vous obtiendrez peut-être de meilleures réponses.