Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-68364
Zhenka
2003-08-08 10:14
2003.08.21
Как удалить заданное слово из файла


14-68484
Vlad Oshin
2003-08-06 09:08
2003.08.21
о как бывает :)


4-68576
NED
2003-06-18 19:28
2003.08.21
Работа с семафорами


14-68439
Карелин Артем
2003-08-06 16:16
2003.08.21
Хорошие сайты по работе с WinApi на дельфи.


8-68417
Маришка
2003-04-23 09:55
2003.08.21
MediaPlayer





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский