|
Вопрос # 4 766/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Прошу Вас помочь мне в следующем вопросе:
Имеются следующие типы данных:
fann_type = double;
PFann_Type = ^fann_type;
PPFann_Type = ^pfann_type;
Fann_Type_Array = array[0..65535] of fann_type;
PFann_Type_Array = ^Fann_type_array;
PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array;
PFann_Train_Data = ^TFann_Train_Data;
TFann_Train_Data = packed record
errno_f: cardinal;
erro_log: PFile;
errstr: Pchar;
num_data: cardinal;
num_input: cardinal;
num_ouput: cardinal;
input: PPFann_Type_Array;
output: PPFann_Type_Array;
end;
Имеется созданная и заполненная переменная:
var
ANN:PFann_Train_Data;
Теперь собственно вопрос:
как получить значения полей input и output в обычные массивы (array of array of Double) для дальнейшей работы.
Заранее благодарен
 |
Вопрос задал: Сергей Мурзинов (статус: Посетитель)
Вопрос отправлен: 27 ноября 2010, 05:31
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: DNK
Здравствуйте, Сергей Мурзинов!
Да вы, батенька, маньяк! Представляешь сколько это данных? У меня получилось 64Гбайт. Если и имеется такая могучая переменная, то не думаю, что это хорошая идея копировать что-либо куда-либо. Лучше уж организовать удобный доступ к ним например с помощью функций:
function getInputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
Result := arg^.input[x]^[y];
end;
function getOutputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
Result := arg^.output[x]^[y];
end;
 |
Ответ отправил: DNK (статус: Студент)
Время отправки: 2 декабря 2010, 14:49
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 13 сентября 2011, 22:58; участников в обсуждении: 5.
|
min@y™ (статус: Доктор наук), 27 ноября 2010, 08:21 [#1]:
Блин, пока пытался вникнуть во все эти указатели на указатели, голова разболелась и заслезились глаза... Зачем нужен такой брейнфакинг? Попроще никак нельзя?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 27 ноября 2010, 09:12 [#2]:
Да вы, батенька, маньяк! Представляешь сколько это данных? У меня получилось 64Гбайт. Если и имеется такая могучая переменная, то не думаю, что это хорошая идея копировать что-либо куда-либо. Лучше уж организовать удобный доступ к ним например с помощью функций:
function getInputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
Result := arg^.input[x]^[y];
end;
function getOutputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
Result := arg^.output[x]^[y];
end;
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 27 ноября 2010, 11:00 [#3]:
Дикая жуть! Зачем всё это надо, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 29 ноября 2010, 18:01 [#4]:
а где здесь 34 Гб?
...
PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array;
// то бишь 65536 указателей
// имеем 65536*sizeof(^double)=256 kb
...
PFann_Train_Data = ^TFann_Train_Data;
TFann_Train_Data = packed record
errno_f: cardinal;
erro_log: PFile; // указатель? 4b
errstr: Pchar; // 4b
num_data: cardinal; // 4b
num_input: cardinal; // 4b
num_ouput: cardinal; // 4b
input: PPFann_Type_Array; // 256 kb
output: PPFann_Type_Array;// 256 kb
end;
var
ANN:PFann_Train_Data;
сама переменная будет размером 4 байта, т.к. она - указатель.
структура, на которую будет показывать переменная, будет размером 4+4+4+4+4+4+512+512=524312 байт - чуть-чуть более 512 kb. кстати, столько же и показал дельфи по команде sizeof(TFann_Train_Data).
хотя...
вопрос-то был
Цитата (Сергей Мурзинов):
как получить значения полей input и output в обычные массивы (array of array of Double) для дальнейшей работы.
с помощью этой структуры можно адресовать данные:
fann_type = double; // 8b
Fann_Type_Array = array[0..65535] of fann_type; // 65536*8 b = 512 kb - данные
PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array; // 65536*512 kb = 32 Gb - данные
// 65536*4 = 256 kb - указатели
...
input: PPFann_Type_Array; // 32 GB + 256 kb
output: PPFann_Type_Array;// 32 GB + 256 kb
имеем, что объём адресуемых данных 64 Гб. Но указатели не обязательно должны показывать на разные области памяти - т.е. базовые издержки на память - чуть более 512 кб, а остальное - в динамической памяти.
и если переводить всё это в
Цитата:
array of array of Double
то...
array [0..65535,0..65535] of double
то как раз и получим два массива по 32 Гб каждый.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 29 ноября 2010, 18:20 [#5]:
и не получиться у вас на 32битной системе индексировать 32 Гб данных (если только эти массивы не перекрываются). 3 Гб в самых-самых затюнингованных настройках.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 29 ноября 2010, 18:28 [#6]:
Самое интересное - это мой вопрос "Зачем всё это надо, а?". Ответа от аффтара так и нету.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 29 ноября 2010, 21:45 [#7]:
Очепятался. 64ГБ. Только данные, накладные расходы не считал.
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 29 ноября 2010, 21:56 [#8]:
Мне 1хрен не понятно, нафига нужны такие извращения? Ну есть же классы и динамические списки указателей (TList, TObjectList и пр.). Нахрена резервировать СТАТИЧЕСКИ такое количество памяти, когда можно:
а) клянчить память у системы динамически по мере необходимости;
б) смастырить БД и бед не знать.
Аффтар молчит, как белорусский партизан под Бобруйском и это не есть гут...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
tonnelll (статус: Посетитель), 13 сентября 2011, 22:58 [#9]:
Такие извращения написал не автор статьи,а тот кто переводил, FANN с С++ на Дельфи, так что тут уж ничего не сделаешь
Столкнулся с тойже проблемой, нормального решения не нашел, пришел к выводу что проще всего использовать fann_save_train() и потом считывать, правда если нужно часто добавлять по чуть-чуть элементов или часто сохранять, то возникают проблемы
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|