Это известно как' Вес Hamming ', 'popcount' или 'поперечное дополнение'.
'лучший' алгоритм действительно зависит, на котором ЦП Вы идете и каков Ваш шаблон использования.
Некоторые центральные процессоры имеют единственную встроенную инструкцию сделать, она и другие имеет параллельные инструкции, которые действуют на битовый векторы. Параллельные инструкции (как x86 popcnt
, на центральных процессорах, где это поддерживается) почти наверняка будут самыми быстрыми. Некоторой другой архитектуре можно было реализовать медленную инструкцию с микрокодированным циклом, который тестирует немного на цикл ( необходима цитата ).
предварительно заполненный метод поиска по таблице А может быть очень быстрым, если Ваш ЦП имеет большой кэш, и/или Вы делаете много этих инструкций в жестком цикле. Однако это может пострадать из-за расхода 'неудачного обращения в кэш', где ЦП должен выбрать часть таблицы от оперативной памяти.
, Если Вы знаете, что Ваши байты будут главным образом 0 или главным образом 1's тогда, существуют очень эффективные алгоритмы для этих сценариев.
я полагаю, что очень хороший алгоритм общего назначения следующий, известен как 'параллель' или 'переменная точность алгоритм SWAR'. Я выразил это на подобном C псевдо языке, Вы, возможно, должны скорректировать его для работы на конкретный язык (например, использующий uint32_t для C++ и>>> в Java):
int numberOfSetBits(int i)
{
// Java: use >>> instead of >>
// C or C++: use uint32_t
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
Это имеет лучшее поведение худшего случая любого из обсужденных алгоритмов, так будет эффективно иметь дело с любым шаблоном использования или оценивает Вас бросок в него.
Этот поразрядный-SWAR алгоритм мог параллелизировать, чтобы быть сделанным в нескольких векторных элементах сразу, вместо в единственном целочисленном регистре, для ускорения на центральных процессорах с SIMD, но никакой применимой popcount инструкцией. (например, код x86-64, который должен работать на любом ЦП, не просто Nehalem или позже.)
Однако лучший способ использовать векторные инструкции для popcount обычно при помощи переменной перестановки, чтобы сделать поиск по таблице для 4 битов во время каждого байта параллельно. (4 бита индексируют 16 таблиц записи, сохраненных в векторном регистре).
На Intel CPUs, аппаратные средства 64 бита popcnt инструкция могут превзойти по характеристикам реализация разрядной параллели SSSE3 PSHUFB
приблизительно фактором 2, но [только 115], если Ваш компилятор получает его просто право . Иначе SSE может выйти значительно вперед. Более новые версии компилятора знают popcnt ложная зависимость проблема на Intel.
Ссылки:
https://graphics.stanford.edu/~seander/bithacks.html
https://en.wikipedia.org/wiki/Hamming_weight
http://gurmeet.net/puzzles/fast-bit-counting-routines/
http://aggregate.ee.engr.uky.edu/MAGIC/#Population%20Count%20 (Ones%20Count)
1) Что касается вашего первого вопроса, вы можете перечислить элементы в корзине, фактически не извлекая их. Вы можете сделать это как с помощью SOAP , так и REST API. Как видите, вы можете определить максимальное количество элементов для списка и позицию, с которой будет начинаться список (маркер). Подробнее об этом здесь .
Я не знаю ни одной реализации пейджинга, но особенно для интерфейса REST было бы очень легко реализовать его на любом языке.
2) I считаю, что единственный способ удалить ведро - сначала очистить его от всех элементов. См. Также этот вопрос .
3) Я бы сказал, что S3 очень хорошо подходит для хранения большого количества файлов. Однако это зависит от того, что вы хотите сделать. Планируете ли вы также хранить двоичные файлы? Вам нужно выполнить какие-либо запросы или достаточно просто перечислить файлы?
Вы можете сделать это:
#define MAKE_LABEL() \
do { \
my_cool_label: \
/* some stuff */; \
goto my_cool_label; \
/* other stuff */; \
} while (0)
Это сохраняет область видимости метки локальной, позволяя любое их количество внутри основного макроса.
Если вы хотите, чтобы метки были доступны более глобально, непонятно, как ваш макрос "MAKE_FUNNY_JUMPING_LOOP"
ссылается на эти ярлыки. Вы можете объяснить?
В вашем случае с Bucket Explorer вы можете щелкнуть правой кнопкой мыши по ведру и выбрать удаление или щелкнуть правой кнопкой мыши и выбрать свойства, и он будет считать количество объектов и размер они берутся. Конечно, он не загружает весь объект. (Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовалось бы несколько часов, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.
Надеюсь, это поможет.
Для этого используйте Bucket Explorer, который сделал все, что мне нужно. В моем случае не стоило тратить время, когда за 50 долларов я могу получить программу, которая делает все, что мне нужно. Вероятно, есть и другие, которые делают то же самое (например, CloudBerry)В вашем случае с Bucket Explorer вы можете щелкнуть правой кнопкой мыши по ведру и выбрать удаление или щелкнуть правой кнопкой мыши и выбрать свойства, и он будет подсчитывать количество объектов и размер они берутся. Конечно, он не загружает весь объект. (Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовалось бы несколько часов, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.
Надеюсь, это поможет.
Для этого используйте Bucket Explorer, который сделал все, что мне нужно. В моем случае не стоило тратить время, когда за 50 долларов я могу получить программу, которая делает все, что мне нужно. Вероятно, есть и другие, которые делают то же самое (например, CloudBerry)В вашем случае с Bucket Explorer вы можете щелкнуть правой кнопкой мыши по ведру и выбрать удаление или щелкнуть правой кнопкой мыши и выбрать свойства, и он будет считать количество объектов и размер они берутся. Конечно, он не загружает весь объект. (Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовались бы часы, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.
Надеюсь, это поможет.
Вероятно, есть и другие, которые делают то же самое (например, CloudBerry)В вашем случае с Bucket Explorer вы можете щелкнуть правой кнопкой мыши по ведру и выбрать удаление или щелкнуть правой кнопкой мыши и выбрать свойства, и он будет подсчитывать количество объектов и размер они берутся. Конечно, он не загружает весь объект. (Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовались бы часы, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.
Надеюсь, это поможет.
Вероятно, есть и другие, которые делают то же самое (например, CloudBerry)В вашем случае с Bucket Explorer вы можете щелкнуть правой кнопкой мыши по ведру и выбрать удаление или щелкнуть правой кнопкой мыши и выбрать свойства, и он будет подсчитывать количество объектов и размер они берутся. Конечно, он не загружает весь объект. (Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовались бы часы, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.
Надеюсь, это поможет.
(Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовались бы часы, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.Надеюсь, это поможет.
(Например, последнее ведро, которое я смотрел, было 12 ГБ и около 500 файлов, и для загрузки 12 ГБ потребовались бы часы, тогда как размер и количество возвращаются через секунду или две). И если есть предел, то это точно не 1000.Надеюсь, это поможет.
«Список» не извлекает данные. Я использую s3cmd (сценарий python), и я бы сделал что-то вроде этого:
s3cmd ls s3://foo | awk '{print $4}' | split -a 5 -l 10000 bucketfiles_
for i in bucketfiles_*; do xargs -n 1 s3cmd rm < $i & done
Но сначала проверьте, сколько файлов bucketfiles_ вы получите. Для каждого файла будет выполняться один s3cmd.
Это займет время, но не дни.
У меня была такая же проблема с удалением сотен тысяч файлов из корзины. Возможно, стоит запустить экземпляр EC2 для выполнения параллельного удаления, поскольку задержка для S3 мала. Я думаю, что нужно заработать немного денег на хостинге нескольких серверов EC2 и взимании платы с людей за быстрое удаление корзин. (По крайней мере, пока Amazon не изменит API)