Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Выгрузить на диск   Найти похожие ветки 

 
Still Swamp   (2003-08-06 16:29) [0]

Есть 100тыс объектов в памяти. Заголовок на каждый объект содержит TList.

Как можно побыстрее выгрузить эти объекты на диск в один файл?


 
Семен Сорокин ©   (2003-08-06 17:04) [1]

как представлены объекты (объявление)? и что надо видеть в файле (в каком формате)?


 
mrcat ©   (2003-08-06 17:06) [2]

>Как можно побыстрее выгрузить эти объекты на диск в один файл?

Написать потомка TList, который будет этим заниматься


 
Digitman ©   (2003-08-06 17:10) [3]


> Как можно побыстрее


Т.е., у тебя пока медленно получается ? Так ?


 
Anatoly Podgoretsky ©   (2003-08-06 17:17) [4]

Приведи код записи


 
Still Swamp   (2003-08-06 17:19) [5]

1. Объекты как представлены - не принципиально... ну допустим это MyObject.TObject с набором пропертей, часть из которых мне и надо выгружать.

2. Да. У меня получается очень медленно. Делаю я это так:
FileCreate
цикл по всем объектам с записью нужных проперти FileWrite.
FileClose


 
Still Swamp   (2003-08-06 17:20) [6]

Текст

FileHandle := FileCreate("c:\file.dat");
if FileHandle = 0 then Raise Exception.Create("Error");
for i:=0 to RecordList.Count-1 do begin
TempRecord:=DataObject.RecordList.ByIndex(i);
FileWrite(FileHandle, TempRecord.Caption, SizeOf(TempRecord.Caption));
end;
FileClose(FileHandle);


 
Digitman ©   (2003-08-06 17:26) [7]


> Still Swamp


радикально быстрей сделать это способов нет.
и быть не может.
даже оптимизация чтения/записи св-ва на asm не даст существенного выигрыша




 
Still Swamp   (2003-08-06 17:32) [8]

не.... ну это на самом деле не так.
можно ускорить и даже сильно.

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

Скажем, как переписать некий Cardinal или из адреса Z в адрес pt:pointer сосмещением k.


 
icWasya ©   (2003-08-06 17:38) [9]

Var Stream:TMemoryStream;

Stream:=TMemoryStream.Create;

for i:=0 to RecordList.Count-1 do begin
TempRecord:=DataObject.RecordList.ByIndex(i);
Stream.Write(PChar(TempRecord.Caption), SizeOf(TempRecord.Caption));
end;


FileHandle := FileCreate("c:\file.dat");
if FileHandle = 0 then Raise Exception.Create("Error");

FileWrite(FileHandle, Stream.Memory, Stream.Size);
FileClose(FileHandle);

TStream.Free;


 
Still Swamp   (2003-08-06 17:44) [10]

ээээээ.... засекал по времени... минут через 5 надоело ждать.

я правда написал Stream.WriteFile.... но думаю до этой строки даже не дошло.


 
Digitman ©   (2003-08-06 17:50) [11]


> Still Swamp


> не.... ну это на самом деле не так.
> можно ускорить и даже сильно.
>
> можно все сначала выгрузить в буффер, а того уже одной записью
> на диск послать


угу... можно ... а завтра тебе захочется кроме св-ва Caption сохранять еще косой десяток св-в ... суммарный выгружаемый объем данных которых превысит размер свободного ВАП процесса на момент выгрузки ... или не превысит, но размер пула свободных страниц ОЗУ в этот момент будет недостаточен для резервирования без сколь-либо заметного свопинга

в результате при таком подходе худший вариант, что ты получишь - EOutOfMemory, чуть лучший - длительный свопинг со сведением на нет всех задуманных тобой преимуществ по предварительному сохранению данных в промежуточный буфер

нет) ... для 100 тыс. записей с учетом будущего наращивания кол-ва св-в - это не дело


 
Still Swamp   (2003-08-06 17:58) [12]

к стати, сильно ускорить процедуру с TMemoryStream помогает заранее вызванный Stream.SetSize(). похоже основное время он тратит на перераспределение памяти. однако с digitman согласен - свопится это изделие безбожно. хорошо когда выгрузка 25 метров.
а если 125 - это уже средняя машина впадет в некую задумчивость.

может еще что придумаете?


 
icWasya ©   (2003-08-06 18:05) [13]

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


 
icWasya ©   (2003-08-06 18:12) [14]

как вариант

TMyObject должен иметь метод что нибудь типа GetData, который упаковывает нужные атрибуты в буфер, а затем буфер целиком записывается в файл

const
MaxBufSize=4096;
Var
Buf :Array[0..MaxBufSize] of Byte;
BufSize:Integer;
TempRecord:TMyObject;

FileHandle := FileCreate("c:\file.dat");
if FileHandle = 0 then Raise Exception.Create("Error");
for i:=0 to RecordList.Count-1 do begin
TempRecord:=DataObject.RecordList.ByIndex(i);
BufSize:=TempRecord.GetData(Buf,MaxBufSize);
FileWrite(FileHandle, Buf, BufSize);
end;
FileClose(FileHandle);


может быть сократится число мелких операций записи



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

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
1-68355
Yuraz
2003-08-08 13:08
2003.08.21
Мастера, как после trunc(Date) обратно получить дату?


3-68184
meridian
2003-07-28 12:41
2003.08.21
Работа с деревом


4-68590
sucer
2003-06-16 06:23
2003.08.21
Как прочитать текстовой файл,если он занят другой програмой?


7-68566
hsi
2003-06-06 10:58
2003.08.21
Как получить количество страниц посылаемых на печать???


3-68199
Flint
2003-07-28 13:27
2003.08.21
Изменение таблицы в Interbase