Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизСлишком медленная работа с файлами. Найти похожие ветки
← →
8ung (2004-02-09 20:54) [0]Привет, мастера.
Мне нужно в программе создать из нескольких файлов(их довольно много) создать один файл. Использую для удобства TMemoryStream.
Но, т.к. приходится обрабатывать файлы размером 50-100 мб, то запихивание файлов в TMemoryStream происходит довольно медленно(даже совсем медленно).
Использую вот такой код:
var
add,files:TMemoryStream;
for i := 0 to List.Items.Count-1 do
begin
Application.ProcessMessages;
add := TMemoryStream.Create;
add.LoadFromFile(List.Items.Strings[i]);
files.CopyFrom(add,add.Size);
add.Clear;
end;
Может что в коде можно исправить для оптимизации?
Или есть другие пути?
← →
VMcL (2004-02-09 20:59) [1]>>8ung © (09.02.04 20:54)
CreateFileMapping + MapViewOfFile
← →
8ung (2004-02-09 21:02) [2]Часто встречал эти функции, но все время старался как-нибудь обходиться без них. Описание дать не можешь(хоть вкратце, как все делается).
← →
Pa5ha (2004-02-09 21:09) [3]Можно BlockRead & BlockWrite. В хэлпе должно быть. Или Fileopen, filewrite, fileread, fileclose. Тоже должно быть, или это уже пройдено?
← →
8ung (2004-02-09 21:12) [4]Так BlockRead & BlockWrite придется использовать в цикле, при этом выполнять кучу операций, тапа открыть файл, закрыть файл и т.п.
Это уже было пройдено...
← →
Юрий Федоров (2004-02-09 22:22) [5]Автору
1. Ты в этом примере теряешь память (или это очепятка \ сокращенная цитата? )
2. А если использовать TFileStream вместо TMemoryStream?
100 метров в оперативку - это жестоко :-)
← →
Slym (2004-02-10 04:37) [6]Первая оптимизация:
var
add,files:TMemoryStream;
begin
add := TMemoryStream.Create;//создать 1 раз!
try
for i := 0 to List.Items.Count-1 do
begin
Application.ProcessMessages;
add.Clear;
add.LoadFromFile(List.Items.Strings[i]);
files.CopyFrom(add,add.Size);
finally
add.Free
end;
end;
И вообще что сей код должен у тебя сотворить?
соединить несколько файлов в один?
← →
alex_*** (2004-02-10 09:18) [7][6] - затраты на конструирование объекта минимальны.
Вариант [5] самый оптимальный на мой взгляд.
← →
Slym (2004-02-10 11:09) [8]2 alex_*** © (10.02.04 09:18) [7]
[6] - затраты на конструирование объекта минимальны. - НЕ ВСЕГДА...
Вариант [5]:
var
add,files:TFileStream;
begin
for i := 0 to List.Items.Count-1 do
begin
Application.ProcessMessages;
add:=TFileStream.Create(List.Items.Strings[i]);
try
files.CopyFrom(add,0);
finally
add.Free;
end;
end;
← →
Skier (2004-02-10 11:13) [9]не спасёт ?
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=6597
← →
Тимохов (2004-02-10 11:30) [10]100 метров в память работает очень быстро если дело не доходит до свапования - в таком случае за пивом можно успеть сходить.
Памяти больше ставть и вперед.
У меня дома такая же машина как на работе, кроме памяти - на работе 256м, дома 1г. На массовых загрузках памяти разница ощутима на несколько порядков.
Итог. Либо памяти больше, либо map используй. Про последнее у Рихтера есть, а также в MSDN/
← →
panov (2004-02-10 12:25) [11]Не надо дополнительно в память загружать файл.
в Slym © (10.02.04 11:09) [8] приведено решение.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.03 c