Сколько оперативной памяти понадобится, чтобы записать имена всех людей на Земле?

Население Земли на данный момент составляет 7,53 миллиарда человек.

Начать нужно с некоторых предположений:

  • Вы используете UTF-8для вашей кодировки, которая может представлять все имена в одном символьном формате. В UTF-8 используется от 1 до 4 байтов на символ, а в большинстве языков — от 1 до 3 байтов.
  • Вы сохраняете имена в их родном наборе символов: Hanzi для китайских имен, Devanagari/Punjabi/Tamil/etc для индийских имен, Arab для арабских имен, Roman для европейских имен и т.д.
  • Вы используете представление переменной ширины.
  • Вы допускаете произвольное количество «имен», поскольку в некоторых частях мира люди могут иметь от 1 до дюжины и более имен.
  • Вы заботитесь об эффективности хранения, поэтому не собираетесь использовать подробное представление, такое как XML.
  • Вас НЕ волнует скорость поиска. Вы можете добавить индексы позже, чтобы повысить производительность.
  • Вам могут потребоваться некоторые метаданные, чтобы указать, где находится данное имя, фамилия и другие «лишние» имена.
  • Возможно, вам удастся выполнить множество оптимизаций, особенно с короткими азиатскими именами; В частности, китайские имена редко содержат более 4 символов для всего имени при хранении в кодировке Ханьцзы.
  • Другие имена, находящиеся на другой крайности, представляют собой собственные испанские имена, состоящие из нескольких «частей».
  • Некоторые имена, например южноиндийские, довольно длинные, поэтому необходимо разрешить представление имен переменной длины.

Итак, допустим, у нас есть такое представление, как

<nbytes:1 byte int><bytes>для каждого элемента имени (почему легче анализировать строку с кодировкой длины, чем анализировать строку в поисках магического терминального символа, поэтому мне никогда не нравились строки C с завершающим NUL для высокоскоростных и очень больших приложений хранения данных)

Итак, разумное представление для каждого имени выглядит примерно так:

Это общее количество байтов в имени, включая метаданные.

  • <nfields-in-name: 1 байт int>

Это общее количество «полей» в имени. Большинство английских названий имеют для этого три поля, но в некоторых языках есть только одно имя, а в других может быть несколько полей. Поэтому лучше всего разрешить произвольное количество имен, до 255…

  • <имя-язык:2 байтовое целое>

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

  • <Имя1><Имя2>…<ИмяN>

Настоящие имена…

Я предполагаю, что хорошая верхняя граница составляет около 64 байтов на имя, включая метаданные. Вероятно, это верхняя граница, тем более что 1,5 миллиарда из 7,5 миллиардов — это китайские имена, которые в нашем формате могут быть представлены примерно 18 байтами или меньше. Несмотря на то, что в UTF-8 они занимают 3 байта на символ, в китайских именах содержится не более 4 символов, а обычно 2 или 3.

Итак, при 64 байтах на имя * 7,53 миллиарда вы получите 481 920 000 000 байт, или чуть меньше 500 ГБ.

Это поместилось бы в ОЗУ многих новых серверов баз данных.

Обратите внимание, что индексация структура списка имен добавит к представлению целую кучу дополнительных байтов…

(Конечно, хранить это в оперативной памяти довольно глупо. Но я интерпретировал вопрос так: сколько байтов — в оперативной памяти или в файле на диске — потребуется для разумного хранения всех человеческих имен, и вот как я ответил на вопрос.)

Обновление: если вы нормализовали избыточные имена или просто использовали хорошее сжатие без потерь алгоритм — вы, вероятно, получите довольно крутое уменьшение пространства. Эти данные идеально подходят для алгоритмов сжатия на основе словаря…

Рекомендуем:  Не включается монитор при включении компьютера – причины, что делать?
Понравилась статья? Поделиться с друзьями:
AddBoard