У меня есть простой текстовый файл, содержащий два столбца, оба целых числа
1 5
1 12
2 5
2 341
2 12
и т. Д.
Мне нужно сгруппировать набор данных по второму значению, так что вывод будет.
5 1 2
12 1 2
341 2
Теперь проблема в том, что файл очень большой, размером около 34 Гб, я попытался написать скрипт на Python, чтобы сгруппировать их в словарь со значением в виде массива целых чисел, но все равно он занимает много места.слишком долго.(Я полагаю, что на выделение array('i')
и расширение их на append
требуется большое время. Сейчас я планирую написать сценарий PIG, который планирую запустить на псевдораспределенной машине 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 до 10 миллионов, в следующем - от 10 до 20 миллионов и так далее.но это оказалось очень медленным.
Решение pig / hadoop интересно, потому что оно хранит все на диске [ну, большинство из них].
Для лучшего понимания этот набор данных содержит информацию о подключениииз ~ 45 миллионов пользователей Твиттера, а формат файла означает, что идентификатор пользователя, заданный вторым числом, следует за первым.
Итаклосьон, который я использовал:
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: