トラッカー、トレント、ピアに関するデータを含む最大300のテキストファイルがあります。各ファイルは次のように構成されています。
tracker.txt
time torrent
time peer
time peer
...
time torrent
...
トラッカーごとに複数のファイルがあり、情報の多くが繰り返されています(同じ情報、異なる時間)。
私が持っているものを分析し、次のようなものに関する統計を報告できるようにしたいと思います
- 各トラッカーにあるトレントの数
- トレントは何台のトラッカーにリストされていますか
- トレントには何人のピアがいますか
- ピアへの急流の数
膨大な量のデータがこれを私にとって困難にしています。これが私が試したことです。
MySQL
私はすべてをデータベースに入れました。エンティティタイプごとに1つのテーブルと、関係を保持するテーブル(たとえば、このトレントはこのトラッカー上にあります)。
データベースへの情報の追加には時間がかかりましたが(これを試したときは13 GBもありませんでした)、後で関係を分析するのは簡単ではありませんでした。やや複雑なクエリはすべて、完了するまでに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
外部キーはありません。既存のエンティティに対応するIDのみを使用できることに自信があり、外部キーチェックを追加することは不必要な遅延のように思われました。これはナイーブですか?
Matlab
これは、手間のかかる作業用に設計されたアプリケーションのように見えましたが、すべてのデータを一度に保持するのに十分なメモリを割り当てることができませんでした。
私は数値データを持っていなかったので、セル配列を使用していました。フットプリントを削減するために、これらの配列から試行に移りました。動作させることができませんでした。
Java
これまでの私の最も成功した試み。Limewireの人々によって提供されたPatriciaTriesの実装を見つけました。これを使用して、データを読み取り、所有している一意のエンティティの数を数えることができました。
- 13トラッカー
- 170万の急流
- 32milピア
ピアでの急流の数の頻度を計算するのはまだ難しいと感じています。私は次のような試行を構築することによってそうしようとしています:
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
トライを構築できれば、各ピアにあるトレントの数を簡単に見つけることができます。私は昨日それをすべて実行しました、そして私が戻ったとき、私はログファイルが書き込まれないことに気づきました、私^Z
はアプリケーションとtime
次のことを報告しました:
real 565m41.479s
user 0m0.001s
sys 0m0.019s
これは私には正しく見えませんが、ユーザーとシステムをそれほど低くする必要がありますか?また、JVMのヒープサイズを7GB(最大および開始)に増やしましたが、それがないと、メモリ不足エラーがすぐに発生します。
数時間/日待ってもかまいませんが、10時間くらいで止まるようです。
私の質問は、どうすればこのデータを分析できるかということだと思います。私が試したことは正しいことですか?足りないものはありますか?Javaソリューションはこれまでのところ最高のようですが、それを機能させるために私にできることはありますか?