Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-80287
syte_ser78
2004-02-03 10:19
2004.02.25
мобильник за 100-140 уев


7-80326
Blondin
2003-12-04 14:08
2004.02.25
RASAPI, Как определить кол-во переданных и принятых байт


1-79703
Karlson
2004-02-10 21:00
2004.02.25
Запрет нажатия *


1-79980
Zvr@b
2004-02-13 15:05
2004.02.25
Как построить график функции


14-80112
N169
2004-02-02 16:32
2004.02.25
Программист назвал сына версией 2.0 :)





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