どちらも整数の 2 つの列を含む単純なテキスト ファイルがあります。
1 5
1 12
2 5
2 341
2 12
等々..
出力が次のようになるように、データセットを 2 番目の値でグループ化する必要があります。
5 1 2
12 1 2
341 2
問題は、ファイルのサイズが約 34 Gb と非常に大きいことです。値を整数の配列として辞書にグループ化する Python スクリプトを作成しようとしましたが、それでも時間がかかりすぎます。array('i')
( の割り当てと拡張にはかなりの時間がかかると思いappend
ます。
現在、疑似分散 Hadoop マシン (Amazon EC3 High Memory Large インスタンス) で実行する予定の豚スクリプトを作成する予定です。
data = load 'Net.txt';
gdata = Group data by $1; // I know it will lead to 5 (1,5) (2,5) but thats okay for this snippet
store gdata into 'res.txt';
これを行う簡単な方法があれば知りたいと思いました。
更新: このような大きなファイルをメモリに保持することは問題外です。Python ソリューションの場合、最初の実行で 4 回の実行を計画しました。1 から 1000 万の 2 番目の col 値のみが次の実行で考慮されます。1000 万から 2000 万などが考慮されます。しかし、これは本当に遅いことが判明しました。
pig / hadoop ソリューションは、すべてをディスク上に保持するため興味深いものです [ほとんどの場合]。
理解を深めるために、このデータセットには約 4,500 万人の Twitter ユーザーの接続に関する情報が含まれており、ファイル内の形式は、2 番目の数値で指定されたユーザー ID が最初の数値の後に続くことを意味します。
私が使用したソリューション:
class AdjDict(dict):
"""
A special Dictionary Class to hold adjecancy list
"""
def __missing__(self, key):
"""
Missing is changed such that when a key is not found an integer array is initialized
"""
self.__setitem__(key,array.array('i'))
return self[key]
Adj= AdjDict()
for line in file("net.txt"):
entry = line.strip().split('\t')
node = int(entry[1])
follower = int(entry[0])
if node < 10 ** 6:
Adj[node].append(follower)
# Code for writting Adj matrix to the file: