Интервьюер попросил меня разработать систему для хранения гигабайт данных, и система также должна поддерживать какой-то запрос.
Описание:
В IDC генерируется огромное количество записей, каждая запись состоит из URL, IP, который посещает url, и времени, когда происходит посещение. Запись, вероятно, может быть заявлена как структура, как эта, но я не уверен, какой тип данных я должен выбрать, чтобы представить их:
struct Record {
url; //char *
IP; //int?
visit_time; //time_t or simply a number?
}
Требования:
Создайте систему для хранения 100 миллиардов записей, а также система должна поддерживать 2 вида запросов, по крайней мере:
Сначала, учитывая период времени (t1, t2) и IP, запросите, сколько urls этот IP посетил за данный период.
Во-вторых, если задан период времени (t1, t2) и URL-адрес, запросите, сколько раз этот URL-адрес посещался.
Я оступился, и вот мое глупое решение:
Анализ:
потому что каждый запрос выполняется в данный период времени , так что:
1. Создайте набор , поместите все время посещения в набор и оставьте набор упорядоченным в соответствии со значением времени от старого до последнего.
2.Создайте хэш-таблицу , используя хэш (visit_time) в качестве ключа , эта хэш-таблица называется временной хэш-таблицей, затем каждый узел в определенном сегменте имеет 2 указателя , указывающие на другие 2 хэш-таблицы соответственно
3. Другими 2 хеш-таблицами будут ip-хеш-таблица и url-хеш-таблица .
ip-hash-table
использует хэш (ip) в качестве ключа, и все ips в одной ip-hash-таблице имеют одинаковое время посещения;
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 '], выполните хеш (t) и найдите ip_hastbl или url_hastbl t, затем подсчитайте и запишите, сколько раз отображается данный ip или url.
Вопросы:
1. Мое решение глупо, надеюсь, вы сможете дать мне другое решение.
2 .В отношении того, как хранить массивные записи на диске, есть совет? Я думал о B-дереве, но как его использовать или применимо ли B-дерево в этой системе?
-121--981126-Я нашел пост с заголовком, очень похожим на этот, но он не дал мне ответа, который я искал. Я пытаюсь использовать builder внутри модели. Код выглядит примерно так:
require 'builder'
class Document < ActiveRecord::Base
...
def create_xml
xml = Builder::XmlMarkup.new( :indent => 2)
...
end
...
end
Когда я пытаюсь выполнить этот код, я получаю следующую ошибку:
NameError: uninitialized constant ActiveRecord::Associations::Builder::XMLMarkup
Но, когда я пробую то же самое в консоли рельсов, все работает просто нормально.
Я что-то упускаю? Любая помощь была бы очень признательна.