Проблема с крупными массивами

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Проблема с крупными массивами

Сообщение Vadim » 02.01.2009 23:12:23

Mantius писал(а):Какие есть варианты?

Вариант только один - купить книжку по базам данных. В двух словах этого не объяснить.
И сесть серьёзно подумать, в каком виде будут храниться данные.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с крупными массивами

Сообщение Timid » 02.01.2009 23:16:58

Vadim писал(а):Mantius
Итого: 37 371 МБ или 37 ГБ. Это если не считать расходов памяти на разные служебные цели.
Делаем вывод, что оперативной памяти Вам не хватит, если Вы используете 32-ух разрядную версию какой-либо операционной системы. Для 64-ёх разрядной ОЗУ вполне хватит, вот только деньги, мать их за ногу... :)
Ситуация патовая. Что тут можно предпринять? Использовать дешёвую память, т.е. жёсткий диск. Для хранения данных наиболее целесообразно использовать какой либо сервер базы данных, т.к. там уже есть все методы занесения и извлечения данных, а так же манипуляций ими.


Есть такое понятие: типизированный файл. Т.е. файл произвольного доступа (Random). Поддержка с самых ранних версий TP.

Воспользуйтесь собственным типом размером в 1М ячеек Single, например mytype=array[0..1024*1024*1024-1] of single
Объявите типизированный файл нужного типа. Всего у вас выходит 38K таких записей.
Напишите функцию трансляции адреса вашего виртуального массива в этот. Например, block=i div (8*1024) shift=((i mod (8*1024)) + j, где i,j - индексы в вашем первом примере (2й случай), а block и shift - это номер блока и смещение в этом блоке для "спроецированного на диск" массива.
Используйте Seek(f,block) для перемещения к нужному блоку или write(f,block,m) и read(f,block,m). m - переменная типа mytype - 1 М дробных чисел.

Будет медленно поначалу, но будет работать.

Потом садитесь за оптимизацию с чтением в память нескольких блоков, работы "вдоль блока ячеек" и так далее.

Пробуйте.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Проблема с крупными массивами

Сообщение *vmr » 03.01.2009 01:53:36

задачка не из тривиальных...

Может быть есть варианты хитростей с переменными? Например, заменить дробные значения целыми, умноженными на 1000 или на 1000 000 чтоб наверняка?

Уменьшение разрядности не даст ощутимого эффекта — общий размер данных уменьшится всего в два раза (ну или в четыре, что уже тяжело представляется). А это не выход

в итоге получим примерно 7-8 Гб.

Есть возможность использовать 64-битную операционку?

Первое, что приходит в голову, так это хранить первый слой в файле на диске — на твердотельном носителе (флешка; для ускорения рандомной выборки)
Все остальное разместить в памяти проблем не вызывает

Какая специфика использования? Как происходит доступ? Обучение "одноразовое" или НС будет постоянно обучатся? На каких компах все это будет работать?

ЗЫ: крайне не рекомендую для этих целей использовать TStringList'ы и базы данных — у них другое предназначение
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: Проблема с крупными массивами

Сообщение shade » 03.01.2009 13:21:33

Mantius писал(а):Я тоже изначально это всё представлял как просто набор матриц 250*250, 144*144 и т.д.(делим сторону первой матрицы на корень из 3, округляем в меньшую сторону до целых, получаем сторону следующей матрицы. Последняя матрица имеет размер 2*2.) Но проблема в том, что в таком случае нужна уже четырехмерная матрица 250*250*144*144(т.е. каждому элементу матрицы размера 144*144 соответствует своя матрица размера 250*250, итого 144*144*250*250 элементов).

Боюсь, что не понял реплики. Нет никакой разницы какой размерности матрица, хоть двух, хоть трех, хоть четырехмерная... и даже если это вообще не матрица, а множество значений.

Как я понял у тебя есть входные данные - очень большой набор значений. На выходе небольшой набор данных. Твоя задача - это преобразование входного набора данных, в выходной, т.е. вычисление некоторой функции. Изначально эта функция тебе не известна и будет уточнятся в процесе обучения (а именно, будут уточнятся неизвестные коэфициенты). Вычисление этой функции у тебя разбито на несколько этапов (слоёв), каждый этап это тоже функция, которая преобразуется большой набор данных в чуть меньший. А результирующая функция - есть композиция этих этапов
Т.е. y = F(x) = F1( F2( F3(x) ) ) и т.п. если слоёв больше.
Где x - входной набор данных ("матрица", в хоть двухмерная, хоть четрыехмерная, хоть вообще круглая или бесформеная), y - выходной набор данных (допустим тоже "матрица").

Если ты напишешь алгоритм вычисления каждой из функций (F1, F2, F3), то будет найдешь F. Здесь надо задаться вопросом, какие эти функции F1, F2, F3, как выглядят. В примере который я привел, тупо смешиваются каждые 4 соседние ячейки в одну. Если немного обобщить, то можно получить такой вид функции.
Путь x - входная матрица, y - выходная
y[i, j] = P(x, i, j) = summa ( A[u, v] * x[i + u, j + v] ), где u, v изменяются от 0 до некоторого K.
В частности, если K = 1 и A[u, v] = 1/4, то получаем y[i, j] = P(x, i, j) = ( x[i, j] + x[i, j+1] + x[i+1, j] + x[i+1, j+1] ) / 4 - пример который я привел выше.

Таким образом, функция P опеределяется через матрицу A (может быть произвольных размеров). Изменяя коэфициенты матрицы A будем получать разные функции P. Более того, я думаю что в данном случае, если известно несколько опорных точек Y{i} = F( X{i} ), то можно попробовать найти методом наименьших квадратов значения коэфициентов матриц(ы) A, такие, что при заданых известных значениях X функция будет возвращать соответствующее известное значение Y

Возможно у тебя другие функции (скорее всего у тебя матрица A будет зависеть от i, j - т.е. для кажого элемента выходной матрицы Y будет своя матрица A), ты нам ничего не сказал о виде своих функций, поэтому нам остается только гадать на кофейной гуще. Обсуждать структуры данных отдельно от алгоритмов (и наоборот, алгоритмы отдельно от структур) - бесполезная трата времени

Vadim писал(а): Для хранения данных наиболее целесообразно использовать какой либо сервер базы данных, т.к. там уже есть все методы занесения и извлечения данных, а так же манипуляций ими.

Лично я не вижу здесь никакой целесообразности использования БД...
Кто-нибудь попробует объяснить зачем тут БД? и как с её помощью можно решить поставленую задачу?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Проблема с крупными массивами

Сообщение Mantius » 03.01.2009 15:42:32

Есть возможность использовать 64-битную операционку?

На буке кор2дуо, на домашнем компе пень4, по-моему, проблематично использовать 64-битную операционку при 32-битных процах. А апгрейд делать я щас никак не потяну.
Какая специфика использования?

распознавание визуальных образов
Как происходит доступ?

доступ к чему?
Обучение "одноразовое" или НС будет постоянно обучатся?

в принципе, возможен вариант того, что просто сесть и один раз обучить сеть, но опять же, при ее работе используются все те же массивы, а вот работать она должна более-менее быстро.
На каких компах все это будет работать?

Вероятнее всего, на буке с кор2дуо 2*2.0 Гц и 2 гига оперативы
ЗЫ: крайне не рекомендую для этих целей использовать TStringList'ы и базы данных — у них другое предназначение

ды вот мне что-то также показалось сразу...
Если ты напишешь алгоритм вычисления каждой из функций (F1, F2, F3), то будет найдешь F.

Это всё замечательно, но проблема не в написании конкретных формул, по которым это всё должно работать, а в том, чтобы вообще заставить программу хоть что-то делать с этими данными. Проще говоря, для теста я брал два вложенных цикла, которые должны были пробежать все элементы массива и каждому из них присвоить даже не рандомное, а просто значение, равное 1. Без всяких функций и т.п.
Как вы догадываетесь, даже в таком исполнении, по понятным причинам, ничего не заработало тупо из-за нехватки памяти. Так вот нужно решить этот вопрос, а функции сверху навешать уже не проблема.
Я пока что больше всего склоняюсь к варианту уменьшить входной рисунок до 200*200 пикселей, но это, повторюсь, уже крайний случай, так как на таких размерах человек-то не всегда нужный образ сможет распознать, сильно сомневаюсь, что у сети это получится.
Mantius
новенький
 
Сообщения: 21
Зарегистрирован: 30.12.2008 23:44:51

Re: Проблема с крупными массивами

Сообщение shade » 03.01.2009 15:47:02

Mantius писал(а):Проще говоря, для теста я брал два вложенных цикла, которые должны были пробежать все элементы массива и каждому из них присвоить даже не рандомное, а просто значение, равное 1. Без всяких функций и т.п.Как вы догадываетесь, даже в таком исполнении, по понятным причинам, ничего не заработало тупо из-за нехватки памяти. Так вот нужно решить этот вопрос, а функции сверху навешать уже не проблема.

Что мешает записать эти данные в файл и обработать описанным выше алгоритмом?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Проблема с крупными массивами

Сообщение Mantius » 03.01.2009 16:39:40

Что мешает записать эти данные в файл и обработать описанным выше алгоритмом?

То, что в этом случае никак не будет выполнено условие:
в принципе, возможен вариант того, что просто сесть и один раз обучить сеть, но опять же, при ее работе используются все те же массивы, а вот работать она должна более-менее быстро.
Mantius
новенький
 
Сообщения: 21
Зарегистрирован: 30.12.2008 23:44:51

Re: Проблема с крупными массивами

Сообщение shade » 03.01.2009 19:26:14

Не вижу проблемы, будет приемлемо быстро.
Хотя скорость можешь сильно зависеть от кривизны рук.

Причем если иходные данные берутся из файла, то возможно удасться достить той же скорости, как если была бы возможность заргрузить матрицу целиком в память. Если данные берутся с устройства, то тоже не вижу проблем, чтобы достичь той же скорости.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Проблема с крупными массивами

Сообщение Vadim » 03.01.2009 20:38:24

shade писал(а):Кто-нибудь попробует объяснить зачем тут БД?

В том же посте есть и объяснение. :) БД - для хранения данных. Собственно и обработку можно там же сделать, если алгоритм несложный.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с крупными массивами

Сообщение shade » 03.01.2009 21:50:32

Так ведь тормознуто будет, особенно если окончательно извратиться и каждый элемент матрицы в отдельной строке таблицы хранить...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Проблема с крупными массивами

Сообщение Logo » 03.01.2009 22:05:28

Не получится Вам решить поставленную задачу столь простым методом, ресурсы пока не те.
Поищите в гуле технологию octree, может это поможет. Это своего рода упаковка для изображений и я думаю, что для распознавания образов должна подойти. Имеет деревовидную структуру, что обеспечивает большую скорость доступа к элементам. Недостаток, в том, что размер матрицы непостоянен. Основано, если так примитивно сказать, на принципе замещения повторяющихся элементов одним, но в реале все гораздо сложнее и эффективнее.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Проблема с крупными массивами

Сообщение Vadim » 03.01.2009 22:12:34

shade
Да я без претензиев. :) Всё равно ведь не знаем, что конкретно там в программе должно происходить. Надо, сначала, серьёзно подумать над типизацией данных.
Мало того, в процессе обсуждения выяснилось, что человек слабо разбирается в двух китах программирования - работе с файлами и с БД. Так что что там лучше использовать - то ли типизированные файлы, но тогда надо подробно и последовательно объяснять работу с файлами, то ли БД, и делать то же самое по поводу работы с БД, совершенно непонятно. :) Пока что ясно только одно - объём данных (возможно :) ) большой и одной оперативной памятью тут не обойтись, надо тем или иным образом переходить на файлы.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблема с крупными массивами

Сообщение shade » 03.01.2009 23:59:00

Logo писал(а):Не получится Вам решить поставленную задачу столь простым методом, ресурсы пока не те.

Я не очень сильно разбираюсь в нейроных сетях, но если конкретизировать задачу, то быть может я буду готов поспорить, что вы не правы. Так для примера, чтобы просмотреть (или конвертировать в другой формат, применить фильтр) фильм на DVD объёмом 7Гб, совсем не обязательно пытаться запихнуть его целиком в оперативную память. Тут тоже самое, основная проблема в том, что Mantius изначально пытается загрузить данные в ОП, вместо того, чтобы немного подумать и переделать алгоритм так, чтобы данные можно было обрабатывать по мере чтения их из файла (или считывания их с датчиков).
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Проблема с крупными массивами

Сообщение Logo » 04.01.2009 01:10:13

shade писал(а):Я не очень сильно разбираюсь в нейроных сетях, но если конкретизировать задачу, то быть может я буду готов поспорить, что вы не правы. ...

Да я и не претендую на свою правоту, просто делюсь мнением. Тем более, что фактически неизвесно, какой требуется результат. Распознать образ, - необязательно иметь такого объёма массив. Как дальше оперировать? Какая скорость распознавания/преобразования требуется? ....
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Проблема с крупными массивами

Сообщение Mantius » 04.01.2009 17:20:13

Не вижу проблемы, будет приемлемо быстро.
Хотя скорость можешь сильно зависеть от кривизны рук.

Причем если иходные данные берутся из файла, то возможно удасться достить той же скорости, как если была бы возможность заргрузить матрицу целиком в память. Если данные берутся с устройства, то тоже не вижу проблем, чтобы достичь той же скорости.

я всё-таки до сих пор не могу понять как это правильно реализовать с использованием жесткого диска.
Поищите в гуле технологию octree, может это поможет. Это своего рода упаковка для изображений и я думаю, что для распознавания образов должна подойти.

поставленная задача пока что еще никем не была решена.
Тут тоже самое, основная проблема в том, что Mantius изначально пытается загрузить данные в ОП, вместо того, чтобы немного подумать и переделать алгоритм так, чтобы данные можно было обрабатывать по мере чтения их из файла (или считывания их с датчиков).

К сожалению, нейронная сеть работает как одно целое, т.е. обрабатывать нужно все нейроны сразу, иначе она просто "тупеет" и смысл многослойности и т.п. теряется.
Распознать образ, - необязательно иметь такого объёма массив.

Предложите какой объем будет меньшим, но приемлемым.
Mantius
новенький
 
Сообщения: 21
Зарегистрирован: 30.12.2008 23:44:51

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

Рейтинг@Mail.ru
cron