Население Земли на данный момент составляет 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 для высокоскоростных и очень больших приложений хранения данных)
Итак, разумное представление для каждого имени выглядит примерно так:
- <nbytes-in-full-name:1 byte int>
Это общее количество байтов в имени, включая метаданные.
- <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 ГБ.
Это поместилось бы в ОЗУ многих новых серверов баз данных.
Обратите внимание, что индексация структура списка имен добавит к представлению целую кучу дополнительных байтов…
(Конечно, хранить это в оперативной памяти довольно глупо. Но я интерпретировал вопрос так: сколько байтов — в оперативной памяти или в файле на диске — потребуется для разумного хранения всех человеческих имен, и вот как я ответил на вопрос.)
Обновление: если вы нормализовали избыточные имена или просто использовали хорошее сжатие без потерь алгоритм — вы, вероятно, получите довольно крутое уменьшение пространства. Эти данные идеально подходят для алгоритмов сжатия на основе словаря…