Suppression de données en double à l'aide de Perl appelée à l'intérieur via un fichier de commandes dans Windows Une fenêtre DOS dans Windows appelée via un fichier de commandes. Un fichier de commandes appelle le script Perl qui exécute les actions. J'ai le fichier batch. Le script de code dans lequel j'ai des données dupliquées est supprimé tant que le fichier de données n'est pas trop volumineux. Le problème qui nécessite une résolution concerne les fichiers de données plus volumineux (2 Go ou plus). Avec cette taille de fichier, une erreur de mémoire se produit lors du chargement du fichier complet dans un tableau pour la suppression des données en double. L'erreur de mémoire se produit dans le sous-programme à: -Comment puis-je supprimer des lignes non uniques d'un gros fichier avec Perl?
@contents_of_the_file = <INFILE>;
(Procédé complètement différent est acceptable tant qu'elle permet de résoudre ce problème, s'il vous plaît suggérer). Le sous-programme est: -
sub remove_duplicate_data_and_file
{
open(INFILE,"<" . $output_working_directory . $output_working_filename) or dienice ("Can't open $output_working_filename : INFILE :$!");
if ($test ne "YES")
{
flock(INFILE,1);
}
@contents_of_the_file = <INFILE>;
if ($test ne "YES")
{
flock(INFILE,8);
}
close (INFILE);
### TEST print "$#contents_of_the_file\n\n";
@unique_contents_of_the_file= grep(!$unique_contents_of_the_file{$_}++, @contents_of_the_file);
open(OUTFILE,">" . $output_restore_split_filename) or dienice ("Can't open $output_restore_split_filename : OUTFILE :$!");
if ($test ne "YES")
{
flock(OUTFILE,1);
}
for($element_number=0;$element_number<=$#unique_contents_of_the_file;$element_number++)
{
print OUTFILE "$unique_contents_of_the_file[$element_number]\n";
}
if ($test ne "YES")
{
flock(OUTFILE,8);
}
}
+1 pour construire réellement le code. –
Ce sera une victoire tant que les lignes en cours de hachage sont de 16 caractères ou plus. Si la longueur de la ligne est inférieure à 16, utilisez plutôt la ligne elle-même comme une clé '% seen'. my $ hashed_line = longueur ($ ligne)> 15? md5 ($ line): $ ligne; fera l'affaire. Voir aussi 'Bit :: Vector' en remplacement de'% keep_line_num' pour réduire l'empreinte mémoire. – dland