Интервьюер попросил меня разработать систему для хранения гигабайт данных, и эта система также должна поддерживать какие-то запросы.
Описание:
В IDC создается огромное количество записей, каждая запись состоит из URL-адреса, IP-адреса, который посещает этот URL-адрес, и времени, когда происходит посещение. Запись, вероятно, можно представить как такую структуру, но я не уверен, какой тип данных выбрать для их представления:
struct Record {
url; //char *
IP; //int?
visit_time; //time_t or simply a number?
}
Требования:
Разработайте систему для хранения 100 миллиардов записей, а также система должна поддерживают как минимум 2 типа запросов:
Во-первых, учитывая период времени (t1, t2) и IP-адрес, запросите, сколько URL-адресов посетил этот IP-адрес за данный период.
Во-вторых, учитывая период времени (t1, t2) и URL-адрес, запросите, сколько раз этот URL-адрес был посещен.
Я споткнулся, и вот мое глупое решение:
Анализ:
потому что каждый запрос выполняется в определенный период времени , поэтому:
1. Создайте набор , поместите все время посещения в набор и сохраните набор, упорядоченный в соответствии со значением времени от более раннего до последнего.
2. Создайте хеш-таблицу , используя хэш (время посещения) в качестве ключа , эта хеш-таблица называется временной хеш-таблицей, затем каждый узел в определенном сегменте ] имеет 2 указателя , указывающих на еще 2 хеш-таблицы соответственно.
3. еще две хэш-таблицы будут ip-hash-table и url-hash-table .
ip-hash-table
использует хэш (ip) в качестве ключа, и все IP-адреса в одной ip-hash-table имеют одинаковое время посещения;
url-hash-table
использует хэш (url) в качестве ключа, и все URL-адреса в одной и той же url-hash-таблице имеют одинаковое время посещения.
Приведите рисунок следующим образом:
time_hastbl
[]
[]
[]-->[visit_time_i]-->[visit_time_j]...[visit_time_p]-->NIL
[] | |
[] ip_hastbl url_hastbl
[] []
: :
[] []
[] []
Итак, при выполнении запроса на (t1, t2):
найдите ближайшее совпадение из установленного времени, допустим, совпадение (t1 ', t2'), тогда все допустимое время посещения попадет в часть набора, начиная с t1 'до t2';
для каждого времени посещения t во временном наборе [t1 ': t2'] выполните hash (t) и найдите t ip_hastbl или url_hastbl, затем подсчитайте и запишите, сколько раз появляется данный ip или url.
Вопросы:
1. Мое решение глупое, надеюсь, вы дадите мне другое решение.
2.Что касается того, как хранить массивные записи на диске, какие-нибудь советы? Я думал о B-дереве, но как его использовать или применимо ли B-дерево в этой системе?