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

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

Население Земли на данный момент составляет 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 ГБ.

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

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

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

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