Оптимизация :Python, Perl и библиотека дерева суффиксов C

У меня есть около 3500 файлов, состоящих из однострочных строк символов. Файлы различаются по размеру (примерно от 200 байт до 1 мб ). Я пытаюсь сравнить каждый файл друг с другом и найти общую подпоследовательность длиной 20 символов между двумя файлами. Обратите внимание, что подпоследовательность является общей только для двух файлов во время каждого сравнения, а не для всех файлов.

Я немного повозился с этой проблемой, и, поскольку я не эксперт, я пришел к небольшому -специальному решению. Я использую itertools.combinations для создания списка в Python, который в конечном итоге содержит около 6 239 278 комбинаций. Затем я передаю файлы по два за раз сценарию Perl, который действует как оболочка для библиотеки дерева суффиксов, написанной на C, и называется libstree . Я пытался избежать такого типа решения, но единственная сравнимая оболочка дерева суффиксов C в Python страдает утечкой памяти .

Итак, вот моя проблема. Я замерил время, и на моей машине решение обрабатывает около 500 сравнений за 25 секунд. Это означает, что для выполнения задачи потребуется около 3 дней непрерывной обработки. И тогда мне приходится делать все это снова, чтобы посмотреть, скажем, на 25 символов вместо 20. Обратите внимание, что я далеко от своей зоны комфорта и не очень хороший программист, поэтому я уверен, что есть гораздо более элегантный способ сделать это. Я подумал, что задам его здесь и создам свой код, чтобы узнать, есть ли у кого-нибудь предложения относительно того, как я могу выполнить эту задачу быстрее.

Код Python:

from itertools import combinations
import glob, subprocess

glist = glob.glob("Data/*.g")
i = 0

for a,b in combinations(glist, 2):
    i += 1
    p = subprocess.Popen(["perl", "suffix_tree.pl", a, b, "20"], shell=False, stdout=subprocess.PIPE)
    p = p.stdout.read()
    a = a.split("/")
    b = b.split("/")
    a = a[1].split(".")
    b = b[1].split(".")
    print str(i) + ":" + str(a[0]) + " --- " + str(b[0])
    if p != "" and len(p) == 20:
        with open("tmp.list", "a") as openf:
            openf.write(a[0] + " " + b[0] + "\n")

Perl-код:

use strict;
use Tree::Suffix;

open FILE, "<$ARGV[0]";
my $a = do { local $/;  };

open FILE, "<$ARGV[1]";
my $b = do { local $/;  };

my @g = ($a,$b);

my $st  = Tree::Suffix->new(@g);
my ($c) = $st->lcs($ARGV[2],-1);

print "$c";

5
задан mstcamus 21 July 2012 в 04:42
поделиться