разработка системы, поддерживающей массивное хранение данных. и запрос

Интервьюер попросил меня разработать систему для хранения гигабайт данных, и эта система также должна поддерживать какие-то запросы.

Описание:

В 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):

  1. найдите ближайшее совпадение из установленного времени, допустим, совпадение (t1 ', t2'), тогда все допустимое время посещения попадет в часть набора, начиная с t1 'до t2';

  2. для каждого времени посещения t во временном наборе [t1 ': t2'] выполните hash (t) и найдите t ip_hastbl или url_hastbl, затем подсчитайте и запишите, сколько раз появляется данный ip или url.

Вопросы:

1. Мое решение глупое, надеюсь, вы дадите мне другое решение.

2.Что касается того, как хранить массивные записи на диске, какие-нибудь советы? Я думал о B-дереве, но как его использовать или применимо ли B-дерево в этой системе?

14
задан Alcott 15 September 2011 в 05:00
поделиться