Как проанализировать ~13 ГБ данных?

У меня есть ~300 текстовых файлов, содержащих данные о трекерах, торрентах и ​​пирах. Каждый файл организован следующим образом:

tracker.txt

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

У меня есть несколько файлов на трекер, и большая часть информации повторяется (одна и та же информация в разное время ).

Я хотел бы иметь возможность анализировать то, что у меня есть, и сообщать статистику по таким вещам, как

  • Сколько торрентов на каждом трекере
  • Сколько трекеров торрентов указано на
  • Сколько пиров у торрентов
  • Сколько торрентов у пиров

Огромное количество данных усложняет мне задачу. Вот что я пробовал.

MySQL

Я помещаю все в базу данных; одна таблица для каждого типа объекта и таблицы для хранения отношений (, например. этот торрент есть на этом трекере ).

Добавление информации в базу данных было медленным (, и у меня не было 13 ГБ, когда я пробовал это ), но последующий анализ взаимосвязей был неудачным -. На выполнение каждого слегка сложного запроса уходило более 24 часов (или вообще ).

Пример запроса::

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

Я попытался увеличить распределение памяти в моем файле my.cnf, но это не помогло. Я использовал файл настроек my-innodb-heavy-4G.cnf.

РЕДАКТИРОВАТЬ :Добавление сведений о таблице

Вот что я использовал:

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

Внешних ключей нет. Я был уверен в своей способности использовать только идентификаторы, соответствующие существующим объектам, добавление проверки внешнего ключа казалось ненужной задержкой. Это наивно?

Матлаб

Это казалось приложением, которое было разработано для тяжелой работы, но я не смог выделить достаточно памяти, чтобы хранить все данные за один раз.

У меня не было числовых данных, поэтому я использовал массивы ячеек,Я перешел от них к попыткам, чтобы уменьшить занимаемую площадь. Я не мог заставить его работать.

Ява

Пока моя самая удачная попытка. Я нашел реализацию Patricia Tries, предоставленную людьми из Limewire. Используя это, я смог прочитать данные и подсчитать, сколько уникальных объектов у меня было:

  • 13 трекеров
  • 1,7 миллиона торрентов
  • 32 миллиона сверстников

Мне все еще слишком сложно определить частоты количества торрентов на пирах. Я пытаюсь сделать это, создавая такие попытки:

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);
    }
}

Из того, что я смог сделать до сих пор, если я смогу построить это peerstrie, я смогу легко узнать, сколько торрентов есть на каждом узле. Я запустил все это вчера, и когда я вернулся, я заметил, что файл журнала не записывается, я ^Zприложение и timeсообщил следующее:

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

Мне это кажется неправильным, должны ли user и sys быть такими низкими? Я должен упомянуть, что я также увеличил размер кучи JVM до 7 ГБ (макс и начал ), без этого я довольно быстро получаю ошибку нехватки памяти.

Я не возражаю ждать несколько часов/дней, но похоже, что все останавливается примерно через 10 часов.

Я думаю, мой вопрос в том, как я могу проанализировать эти данные? Являются ли вещи, которые я пробовал, правильными? Есть вещи, которые мне не хватает? Решение Java пока кажется лучшим, могу ли я что-нибудь сделать, чтобы оно заработало?

17
задан Community 22 September 2017 в 17:44
поделиться