Xpoint
   [напомнить пароль]

Дубликаты в строках

Метки: [без меток]
2008-02-17 23:02:45 [обр] v0l4arrra[досье]
Добрый день.
Есть задача пропарсить большие файлы данных размером в гиг самые малые и удолить там дубликаты данных. Например, найдя две строки содержащие один адрес сайта - оставить только одну строку.
Хранить все найденные данные в памяти кажеться задачя не самая лучшая.
Думаю может кто уже сталкивался с подобным - буду рад, если поможете.
спустя 5 часов [обр] AB...(10/233)[досье]
DataBase
спустя 4 часа 5 минут [обр] v0l4arrra[досье]
хм..не понимаю вашего ответа - предлагаете загнать все в базу данных с отсевом по уникальным хостам? Или что?
А что делать если надо постоянно парсить - постоянно туда-сюда гонять данные?
спустя 45 минут [обр] Nuclon(9/19)[досье]

делаете SQLite database, с таблицей urls, с единственной колонкой - url, делате ее primary key
после этого БД сама не даст вам записать в нее два одинаковых урла.

если вы собираетесь гонять все туда-сюда - может у вас проблемы с архитектурой? Почему нельзя загнать адреса в БД и использовать уже оттуда?

спустя 6 часов [обр] v0l4arrra[досье]
Я это конечно все знаю. И про БД помнил версию. Но ситуация осложняеться тем, что скриптом буду пользоваться не только я. А всем объяснять, что ставить модули + разные ОС. Конечно, неудобно. Если бы я только пользовался - то сразу бы загонял все в мускуль. Но если не найду другого способа - придеться следовать этому ))
спустя 8 часов [обр] AB...(10/233)[досье]
Не совсем представляю проблему с DataBase, но к сожелению я не представляю себе решения обработки огромеых данных не использую DB. Альтернативой реальной DB может быть модуль DBM. В принципе это вполне укладывается в ваши требования отбора данных.
спустя 20 дней [обр] v0l4arrra[досье]

Может кому поможет этот незатейливый скриптик. С базой конечно быстрее. но когда нет возможности ее использовать, подойдет и это.

#!/usr/bin/env perl
use strict; use warnings;
#########################

$| = 1;

my $first = $ARGV[0] or print "$0 file.txt dest.txt\n" and exit;
my $dest = $ARGV[1] or print "$0 file.txt dest.txt\n" and exit;
open(FIRST,"<$first") || die "Can't open $first: $!\n";
open(OUTPUT,"+>$dest") || die "Can't open $dest: $!\n";

print "OK! Starting..\n";

while(<FIRST>){
 my $line = $_;
 my $true = 0;
 my $tail = tell OUTPUT;
 seek OUTPUT, 0, 0;
 while(<OUTPUT>){
  if($_ eq $line){$true = 1;}
 }
 seek OUTPUT, $tail, 0;
 if(not $true){print OUTPUT $line;}
}
close(FIRST);
close(OUTPUT);

спустя 15 часов [обр] Dennis F. Latypoff aka funky_dennis(24/78)[досье]
man uniq
Powered by POEM™ Engine Copyright © 2002-2005