Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Загрузить одним махом несколько динамических массивов.   Найти похожие ветки 

 
Дмитрий С ©   (2012-05-16 13:04) [0]

Знатоки внутренностей дельфи, подскажите, как загрузить массив динамических массивов из файла одним махом (предварительно файл в нужном формате, конечно, подготовлю)?

К примеру есть тип
TSomeDynArray = array of record {......} end;

надо загрузить из файла переменную
A: array of TSomeDynArray


 
oldman ©   (2012-05-16 13:18) [1]


> одним махом


типа loadfromfile? вряд-ли.
придется писать процедуру загрузки из нескольких строк.


 
Омлет ©   (2012-05-16 13:20) [2]

Никак. Только по отдельности каждый подмассив, т.к. длина их не одинакова.


 
oxffff ©   (2012-05-16 13:21) [3]

Как в файле идет разделение по первой границе(по внешнему массиву)?
Что это за признак?


 
oxffff ©   (2012-05-16 13:22) [4]

Предварительно конечно [2]. Но можно подумать как красиво обернуть.


 
Ega23 ©   (2012-05-16 13:32) [5]

Грузи в память, а там дальше разбивай, это явно быстрее будет.


 
oxffff ©   (2012-05-16 13:38) [6]

Можно сделать непрерывный блок, и обернуть его анонимных методом с двумя параметрами индексами.
Отступы по внешнему массиву предварительно рассчитать при необходимости.
Будет вкусно и очень полезно. :))


 
Ega23 ©   (2012-05-16 13:41) [7]


> Можно сделать непрерывный блок, и обернуть его анонимных
> методом с двумя параметрами индексами.


+1, так и делал.


 
oxffff ©   (2012-05-16 13:43) [8]


> Ega23 ©   (16.05.12 13:41) [7]
>


Вы меня пугаете, Олег. :)


 
Дмитрий С ©   (2012-05-16 13:51) [9]


> oxffff ©   (16.05.12 13:21) [3]
>
> Как в файле идет разделение по первой границе(по внешнему
> массиву)?
> Что это за признак?

Твоего то ответа я больше всего и ждал.

Файла пока нет, будет такой какой нужно.

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

Вот бы выделить память сразу под все, загрузить туда а потом наделать ссылок на дин. массивы. Предварительно накрутив счетчик ссылок, чтобы delphi не попытался освободить их.


 
Ega23 ©   (2012-05-16 14:13) [10]


> Вы меня пугаете, Олег. :)


На самом деле, была куча здоровых файлов с кучей вот таких вот "массивов".
Загружал его целиком, а там уже метки оффсетов расставлял.


 
Ega23 ©   (2012-05-16 14:13) [11]

Не совсем то, что ты предложил, но нечто похожее.


 
oxffff ©   (2012-05-16 14:19) [12]

Идея в коде

function Wrap<T>(const items: array of T;const sizes: array of integer): TFunc<integer, integer, T>;
var Captureditems:array of T;
   CapturedOffsets:array of integer;
   i:integer;
   offset:integer;
begin
Setlength(Captureditems,length(items));
//корректно в случае, когда T не содержит управляемых типов
CopyMemory(Captureditems,@items[0],sizeof(items));
setlength(CapturedOffsets,length(sizes));
offset:=0;
for i:=0 to length(sizes)-1 do
 begin
 CapturedOffsets[i]:=offset;
 inc(offset,sizes[i]);
 end;
result:=function (Idx1:integer;Idx2:integer):T
       begin
       result:=Captureditems[CapturedOffsets[idx1]+Idx2];
       end;
end;

Wrap<integer>([1,2,3,4,5,6,7,8,9,10],[4,6]);


 
oxffff ©   (2012-05-16 14:20) [13]

Правда баги компилятора не радуют.
[DCC Error] Unit1.pas(44): E2506 Method of parameterized type declared in interface section must not use local symbol ":4"


 
Sapersky   (2012-05-16 14:41) [14]

Вот бы выделить память сразу под все, загрузить туда а потом наделать ссылок на дин. массивы.


Type
 TSomeRecord = record a, b : Integer; end;

 PArray =^TArray;
 TArray = array[0..(MAXINT div SizeOf(TSomeRecord))-1] of TSomeRecord;
Var
 A: array of PArray;
 Data : array of TSomeRecord;
begin
SetLength(A, 2);
SetLength(Data, 3 + 4);
A[0] := @Data[0]; A[1] := @Data[3];
A[1, 3].a := 4; // самый последний элемент...


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


 
KSergey ©   (2012-05-16 15:41) [15]

Дмитрий С
А сколько динамических массивов-то ожидается? 10..20 по тыще элементов, или тыща по 10 элементов?

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

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


 
oxffff ©   (2012-05-16 15:41) [16]


> Sapersky   (16.05.12 14:41) [14]


Кстати да, как вариант оптимизации [12].
Храним в CapturedOffsets не отступы, а указатели.


 
Leonid Troyanovsky ©   (2012-05-16 18:05) [17]


> Дмитрий С ©   (16.05.12 13:51) [9]

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

Если при запуске, то можно смотреть на compaund file.
Ежели по-большому - SQL server forever.

--
Regards, LVT.


 
Cobalt ©   (2012-05-16 18:38) [18]

> Дмитрий С ©   (16.05.12 13:04)  
Опиши, пожалуйста, вкратце задачу - где такое может понадобиться?



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.065 c
4-1258417192
мурзик
2009-11-17 03:19
2013.03.22
Как определить что за изменения произошли в директории?


15-1350926092
Дмитрий С
2012-10-22 21:14
2013.03.22
Электрический натягиватель троссика?


15-1351869908
Dennis I. Komarov
2012-11-02 19:25
2013.03.22
ОКУД: xml + xsl


2-1340011274
начинающий_
2012-06-18 13:21
2013.03.22
битовые операции


15-1339341068
Дмитрий С
2012-06-10 19:11
2013.03.22
TCP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский