LINUX.ORG.RU

Как посчитать статистику, экономя память?

 , ,


0

2

Доброго времени суток.

Есть несколько файлов, в каждом - данные отдельного теста, список прочитанных блоков HDD

Нужно посчитать кратность чтения. Т.е. суммарно по всем тестам было прочитано X блоков, из них 1 раз N_1 блоков, 2 раза N_2 блоков и т.д. Всего прочитано Y уникальных блоков ( Y = sum N_i по всем i )

Всего уникальных номеров блоков допустим 100M ( объём тестового диска / размер блока ). Поэтому первая же идея - загнать всё в ассоциативный массив { номер_блока -> количество чтений } - оказалось неудачной, требуется слишком много памяти.

Есть идеи?

★★★★★

Последнее исправление: router (всего исправлений: 1)

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

router ★★★★★
() автор топика
Ответ на: комментарий от router

.pl

Может попробовать на чем-то более предсказуемом в плане памяти? С++ например. Ассоциативные массивы из stl не должны потреблять много памяти. В крайнем случае можно сложить в какой-нибудь bdb. Или sqlite

anonymous
()
Ответ на: комментарий от router

а, это я ошибся. передавал вместо номера сектора его смешение, т.е. получилось в 4096 раз больше. Массив размера 100M создаёт без проблем

router ★★★★★
() автор топика

Если задача однократная или редкая и не требует производительности, то самое простое будет обрабатывать по диапазонам. Т.е. разделить диапазон на m частей и сделать много проходов, где первый раз учитывать только элементы из первой части, потом второй и т.д., сбрасывая результаты куда-нибудь. Например, для 0..1000000, сначала обработать 0..50000 (а остальные игнорировать), потом 50000..100000 и т.д.

Для скорости можно сначала входные данные отсортировать, тогда уже останется только считать смежные повторы, для чего память нужна константная.

xaizek ★★★★★
()

Но я что-то не понял, в чем проблема создать массив из 10^8 элементов?

Waterlaz ★★★★★
()

ассоциативный массив

а просто массив чем не устраивает? блоки же сплошную нумерацию имеют?

MyTrooName ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.