Como posso analisar ~ 13GB de dados?

Eu tenho ~ 300 arquivos de texto que contêm dados sobre rastreadores, torrents e peers. Cada arquivo é organizado assim:

tracker.txt

time torrent
    time peer
    time peer
    ...
time torrent
...

Eu tenho vários arquivos por rastreador e grande parte da informação é repetida (mesma informação, horário diferente).

Gostaria de poder analisar o que tenho e relatar estatísticas sobre coisas como

Quantos torrents estão em cada rastreadorQuantos rastreadores são torrents listadosQuantos pares os torrents têmQuantos torrents para os pares têm

A enorme quantidade de dados está dificultando isso para mim. Aqui está o que eu tentei.

MySQL

Eu coloquei tudo em um banco de dados; uma tabela por tipo de entidade e tabelas para manter os relacionamentos (por exemplo, esse torrent está nesse rastreador).

Adicionando as informações para o banco de dados foi lento (e eu não tinha 13GB dele quando eu tentei isso), mas analisando os relacionamentos depois foi um não-ir. Cada consulta levemente complexa levou mais de 24 horas para ser concluída (se for o caso).

Um exemplo de consulta seria:

SELECT COUNT(DISTINCT torrent) 
    FROM TorrentAtPeer, Peer 
    WHERE TorrentAtPeer.peer = Peer.id 
    GROUP BY Peer.ip;

Eu tentei aumentar as alocações de memória no meumy.cnf arquivo, mas não parece ajudar. Eu usei omy-innodb-heavy-4G.cnf arquivo de configurações.

EDIT: Adicionando detalhes da tabela

Aqui está o que eu estava usando:

Peer         Torrent                  Tracker        
-----------  -----------------------  ------------------  
id (bigint)  id (bigint)              id (bigint)
ip* (int)    infohash* (varchar(40))  url (varchar(255))
port (int)

TorrentAtPeer      TorrentAtTracker
-----------------  ----------------
id (bigint)        id (bigint)
torrent* (bigint)  torrent* (bigint)
peer* (bigint)     tracker* (bigint)
time (int)         time (int)

*indexed field. Navicat reports them as being of normal type and Btree method.
id - Always the primary key

Não há chaves estrangeiras. Eu estava confiante na minha capacidade de usar apenas IDs que correspondiam a entidades existentes, adicionando uma verificação de chave estrangeira parecia um atraso desnecessário. Isso é ingênuo?

Matlab

Isso parecia um aplicativo projetado para um trabalho pesado, mas não consegui alocar memória suficiente para armazenar todos os dados de uma só vez.

Eu não tinha dados numéricos, então eu estava usando matrizes de células, mudei-as para tentativas em um esforço para reduzir a pegada. Eu não consegui fazer isso funcionar.

Java

Minha tentativa mais bem sucedida até agora. Eu encontrei uma implementação de Patricia Tries fornecida pelo pessoal do Limewire. Usando isso, consegui ler os dados e contar quantas entidades exclusivas eu tinha:

13 rastreadoresTorrents de 1.7mil32mil pares

Eu ainda estou achando muito difícil descobrir as frequências do número de torrents nos colegas. Eu estou tentando fazer isso construindo tentativas como esta:

Trie<String, Trie<String, Object>> peers = new Trie<String, Trie<String, Object>>(...);
for (String line : file) {
    if (containsTorrent(line)) {
        infohash = getInfohash(line);
    }
    else if (containsPeer(line)) {
        Trie<String, Object> torrents = peers.get(getPeer(line));
        torrents.put(infohash, null);
    }
}

Pelo que eu pude fazer até agora, se eu conseguir essepeers Então, eu posso facilmente descobrir quantos torrents estão em cada peer. Eu corri tudo ontem e quando voltei notei que o arquivo de log não ia ser escrito, eu^Z a aplicação etime relatou o seguinte:

real 565m41.479s
user 0m0.001s
sys  0m0.019s

Isso não parece certo para mim, o usuário e o sistema devem ser tão baixos? Eu devo mencionar que eu também aumentei o tamanho de heap da JVM para 7GB (max e start), sem que eu rapidamente consiga um erro de falta de memória.

Eu não me importo de esperar por várias horas / dias, mas parece que a coisa vai parar depois de 10 horas.

Eu acho que minha pergunta é: como posso analisar esses dados? São as coisas que eu tentei as coisas certas? Há coisas que estou perdendo? A solução Java parece ser a melhor até agora, há algo que eu possa fazer para que funcione?

questionAnswers(4)

yourAnswerToTheQuestion