Меня попросил интервьюер разработать систему для хранения гигабайт данных, и система также должна поддерживать какой-то запрос.
Описание:
В IDC имеется огромное количество записей, каждая запись состоит из URL-адреса, IP-адреса, который посещает URL-адрес, и времени посещения. Запись, вероятно, может быть указана как структура, подобная этой, но я не уверен, какой тип данных я должен выбрать для их представления:
struct Record {
url; //char *
IP; //int?
visit_time; //time_t or simply a number?
}
Требования:
Создайте систему для хранения 100 миллиардов записей, а также система должна поддерживать не менее двух видов запросов:
Сначала, учитывая период времени (t1, t2) и IP, запросите, сколько URL-адресов, которые этот IP посетил за данный период.
Во-вторых, учитывая период времени (t1, t2) и url, запросите, сколько раз этот URL был посещен.
Я споткнулся, и вот мое глупое решение:
Анализ:
потому что каждый запрос выполняется в течение определенного периода времени, поэтому:
1. Создайте набор, поместите все время посещения в набор и сохраните заданный порядок в соответствии со значением времени от более старого до последнего.
2.Создаем хеш-таблицу с использованием хэша (visit_time) в качестве ключа, эта хеш-таблица называется time-hash-table, затем каждая node в конкретный ковш имеет 2 указателя, указывая на другие 2 хэш-таблицы соответственно.
3. еще две хэш-таблицы будут ip-hash-table и url-hash-table... p >
ip-hash-table
использует хэш (ip) в качестве ключа, и все ips в одной и той же таблице ip-hash имеют одинаковое время посещения;
url-hash-table
использует хэш (url) в качестве ключа, и все URL-адреса в одной и той же таблице URL-адресов имеют одинаковое время посещения.
Дайте рисунок следующим образом:
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'], do hash (t) и найти t ip_hastbl или url_hastbl, затем подсчитывать и регистрировать, сколько раз появляется данный ip или url.
Вопросы:
Решение 1.My глупо, надеюсь, что вы можете дать мне другое решение.
2. Что касается хранения массивных записей на диске, любой совет? Я думал о B-дереве, но как его использовать или B-tree применим в этой системе?