У меня есть ~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. Используя это, я смог прочитать данные и подсчитать, сколько уникальных объектов у меня было:
Мне все еще слишком сложно определить частоты количества торрентов на пирах. Я пытаюсь сделать это, создавая такие попытки:
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);
}
}
Из того, что я смог сделать до сих пор, если я смогу построить это peers
trie, я смогу легко узнать, сколько торрентов есть на каждом узле. Я запустил все это вчера, и когда я вернулся, я заметил, что файл журнала не записывается, я ^Z
приложение и time
сообщил следующее:
real 565m41.479s
user 0m0.001s
sys 0m0.019s
Мне это кажется неправильным, должны ли user и sys быть такими низкими? Я должен упомянуть, что я также увеличил размер кучи JVM до 7 ГБ (макс и начал ), без этого я довольно быстро получаю ошибку нехватки памяти.
Я не возражаю ждать несколько часов/дней, но похоже, что все останавливается примерно через 10 часов.
Я думаю, мой вопрос в том, как я могу проанализировать эти данные? Являются ли вещи, которые я пробовал, правильными? Есть вещи, которые мне не хватает? Решение Java пока кажется лучшим, могу ли я что-нибудь сделать, чтобы оно заработало?