У меня есть 100 триллионов элементов, каждый из которых имеет размер от 1 байта до 1 триллиона байтов (0,909 TiB).Как их хранить и получать к ним доступ очень эффективно? - PullRequest
3 голосов
/ 10 декабря 2011

Это вопрос интервью:

Пусть: У меня есть 100 триллионов элементов, каждый из которых имеет размер от 1 байта до 1 триллиона байтов (0,909 TiB). Как их хранить и получать к ним доступ очень эффективно?

Мои идеи: Они хотят проверить знания об эффективной обработке большого объема данных. Это не единственный вопрос с правильным ответом.

Сохранить их в какой-то специальной структуре данных?

На самом деле у меня нет идей относительно такого рода открытого вопроса.

Любая помощь очень ценится.

Ответы [ 4 ]

5 голосов
/ 10 декабря 2011

Это действительно зависит от набора данных, о котором идет речь.Я думаю, что для вас важно обсудить альтернативы и описать различные плюсы и минусы.

Возможно, вам следует ответить на их вопрос большим количеством вопросов!

  • Как это должно бытьдоступ?(последовательно, случайно, какое-то предсказуемое распределение?)
  • Важен ли порядок элементов?
  • Изменится ли размер элементов?
  • Насколько важна производительность вставки / удаления?

Структура данных, которую вы выберете, будет зависеть от того, какие компромиссы вы готовы совершить.

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

Если вместо этого вам нужен произвольный доступ, вы можете посмотреть:

  • Хеш-таблицы(поиск в постоянном времени, но нужна хорошая хеш-функция для данных)
  • Какая-то структура индекса / дерева?
  • Кэширование!Вы, вероятно, не сможете хранить все это в памяти - и даже если вы захотите, вы захотите воспользоваться преимуществами локальности данных, где это возможно.

TL; DR: Это все зависит от проблемы.Есть много альтернатив.

По сути, это та же проблема, с которой сталкиваются файловые системы / базы данных.

2 голосов
/ 10 декабря 2011

Самый простой и недорогой вариант (по крайней мере, до массового увеличения) - использовать существующий сервис, такой как Amazon S3.

2 голосов
/ 10 декабря 2011

Я бы использовал некоторую распределенную форму B-дерева . B-дерево может хранить огромное количество данных с очень хорошим временем доступа (дерево обычно не очень глубокое, но очень широкое). Благодаря этому свойству оно используется для индексации в реляционных базах данных. И также не будет очень трудно распределить его среди множества узлов (компьютеров).

Я думаю, что этого ответа должно быть достаточно для интервью ...

1 голос
/ 10 декабря 2011

Ну, я бы использовал DHT и разделил бы его на куски по 8 МБ.Затем создайте таблицу с файловым хешем (SHA-1 256), именем файла и чанками.

Чанки будут храниться в чанках в 3 разных NAS.Иметь NAS-серверы емкостью 1200 ТБ и балансировщики нагрузки, чтобы получить любую из трех копий, которые удобнее получать в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...