компьютеры

Не то лыжи, не то сишарп

Попробовал приколхозить свою нейросеть для распознавания изображения. Замахнулся обработать картинку 256х256. Обломился, не хватает памяти. Ладно. Попробуем 100х100, и заменим double (64 бита) на float (32 бита). Всё равно не хватает памяти. Ругнулся, сказал, компилировать только под x64. Взлетело. Но отжирает 8 гиг памяти, и работает просто капец как медленно.

Что-то я тут не вкуриваю. Вот у меня основа всего колхоза -- два массива float'ов 20 000 на 20 000. Это два блока по 12 800 000 000 бит или 1 526 мегабайт. Итого три гига, нормуль по современным меркам.

Откуда отжираемые 8 гиг-то, ёлкин кот?

Прямо хоть на гольных Сях под Линуксом переписывай.
Думаю, там дохера dll-ок линкуется.

Оно как Debug компилится или как Release?

Может быть. Откомпиляй релиз и посмотри.

Примерно то же самое :(

Плюнул, переписал, теперь у меня два массив в четыре раза меньше, 10 000 на 10 000. По идее они должны занимать 762 мегабайта. Ан хрен -- отжирают полтора.

Непонять.

Скорость работы тоже не улучшилась.

Надо будет таки попробовать на сях нарисовать, у меня там особо какой-то объектной ориентированности всё равно нет.
Дык, дорогой товарищ!
А как ты их создаешь?
Это обычные массивы, или листы? Потому что если последнее - память то там выделяется по принципу - не хватает? Выделим в два раза больше чем нужно, чтоб два раза не вставать

Ну и вообще, стоит приобрести/скачать нормальный профайлер для этих целей, оне нынче шибко умные стали
Массив массивов.

float [][] weights;

float[][] weights = new float[10000][]

for (int i = 0; i < weights.Length; i++)
{
weights[i] = new float[10000];
}

Это если примерно. Фактически массив jagged, т.к. в слоях разное количество нейронов.
тогда мой единственный совет будет скачать профайлер
Потому что так по интернету ничего не скажешь
например, https://www.jetbrains.com/profiler/ - лучший, но за деньги. Но есть триал

Ну или если у тебя 2015 студия, там встроенный есть
ааааа, бля
new float[10000][]

Вот тут-то у тебя память и выделяется больше чем надо
т.к. float[] - это ArrayList вообще-то, это вам не си
Итицка сила. А можно его сразу создать нужного размера?

float[][] weights = new float[10000][10000]; -- ругается.
float[,] v = new float[100,100];

но ты профайером полььзуйся все таки, раз у тебя такие ресурсоемкие задачи, он тебе гораздо больше покажет
Он мне, зараза, только имя объекта показывает, который столько занимает. Имя самого большого объекта я и сам знаю.
попробуй 1 массив размером 10000 * 10000, а индекс считай сам типа номер колонки + номер строки * ширина масива
Я не знаю как его сразу нужного размера создать.

float[][] weights = new float[10000][10000]; -- ругается.

Можно вот так, конечно:

float[,] weights = new float[10000,10000]; -- но помнится у меня какие-то с такой адресацией возникли сложности.
я его понимаю, я б тоже ругался. лучше так, дешево и сердито:

const int size = 10000;
float[] weights = new float[size * size];
int row = 100, column = 200; // 0 .. size-1
weights[row + column * size] = 3.14F; // в ячейку №100 в колонку №200