Форум: "Основная";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
ВнизВыгрузить на диск Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c