2
EugenePhoenixЦитата:
Если кто знает, подскажите какой-нибудь альтернативный вариант хранеия матриц. Наверно, чтобы в памяти находилась не вся матрица сразу, а только ее часть.
Ну, в таком случае, т.е. при хранении в памяти лишь части матрицы, неизбежно использование жесткого диска и техник кэширования. Технические приемы, упомянутые некоторыми участниками обсуждения (
gris и
Vassil), вроде хранения различных реплик данных в различных форматах, конечно же должны исследоваться и применяться. Жесткие диски действительно являются довольно медлительными устройствами и рациональное их использование, в том числе и оптимизация позиционирования головки, стоит дополнительных, но, безусловно, оправданных затрат и возможных неудобств. Да и дублирование информации в распределенных системах ещё никому не вредило. :)
Но я, конечно, хотел сказать совсем другое. Лично мне не приходилось иметь дело с большими матрицами, допускающими применение эффективных схем хранения за счет наличия у них какой-либо структуры, будь-то блочность, разряженность, энтропийная избыточность (сжимаемость) или ещё что... Разве что писал простой встраиваемые поисковый движок, основанный на векторной модели документов; но там своя специфика, все совсем по-другому...
Зато писалась небольшая библиотека для работы с большими терапиксельными картинками (астрономическими, в основном). Хотелось очень большое изображение, заведомо не помещающееся в ОЗУ, просматривать на дешевом железе не испытывая при этом каких-либо неудобств. То есть, библиотека должна была в первую очередь позволять плавно прокручивать изображение при произвольном масштабе.
Требуемое поведение достигалось именно использованием кэширования, хранения копий просматриваемого региона в различных масштабах, упреждающего чтения областей, буферизации и т.д.
К слову сказать, разработка была заморожена, особенно после ознакомления с софтинами наподобие vips/graphicsmagick/imagemagick/&c. :) Ну да ладно... Я вот думаю, что возможно в решении ваших задач могут помочь аналогии именно с обработкой изображений.
Как раз-таки здесь, как мне кажется, важна именно "неодномерность" информации в матрице, то есть, локальность обрабатывающих алгоритмов и последовательность доступа. Например, возится ваш алгоритм с некоторым куском матрицы (e.g., с квадратом фиксированных размеров, скажем
), можно ведь за это время подгрузить (в фоне) с диска в память соседние куски (4 или даже 8 штук). Если алгоритм с большой вероятностью перейдет в один из соседних кусков, то тот будет уже в памяти и это не повлияет на производительность (понятно, что кусками могут быть и полосы из нескольких строк; отношения соседства тоже могут быть различными). Примерно так...
Можно ещё использовать компромиссные решения, например пользуясь файлами, отображаемыми в память (то есть, позволяя часть работы по оптимальному кэшированию/своппингу выполнять операционной системе); это, как правило, приводит к заметному ускорению по сравнению с самостоятельным использованием дисковых/файловых IO-операций.
Вот такие вот мыслишки... Может быть не в тему, но все же...