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

Вниз

Слишком медленная работа с файлами.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
9-79527
DNT
2003-08-09 18:41
2004.02.25
Оцените проект школьника


14-80171
VID
2004-01-31 20:32
2004.02.25
Знатокам VBScript...


1-79732
Серёга
2004-02-02 15:29
2004.02.25
TStringgrid


7-80330
Borys
2003-12-03 22:31
2004.02.25
Запуск ехе-файла и посылка на него сообщения


1-79982
h0use
2004-02-13 15:45
2004.02.25
Как из строки где записано 16-ное число сделать Integer