Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
namss
1

Работа с большим объёмом данных

23.12.2013, 22:34. Показов 1220. Ответов 1
Метки нет (Все метки)

Приветствую всех! На днях столкнулся с такой проблемой: необходимо отправить на сервер файл большого размера (для теста взял 37 МБ) из программы на дельфи.
Написал код, потестировал на малых файлах, до 655 КБ - всё ок, работает, файл отправляется на сервер как надо, даже контрольные суммы проверял. Пытаюсь отправить файл 37 МБ - процесс начинает занимать всё больше и больше памяти, потом долго использованная память остаётся на уровне 200-230 МБ, и на 369 МБ вылезает ошибка "Project raised exception class EIdSocketError with message 'Socket Error # 10054 Connection reset by peer.' " При этом оперативная память на компе не заканчивается. Отладчик дельфи выделяет строку на которой выскочило исключение, я её отметил комментарием. Если проигнорировать исключение и продолжить выполнение программы, история повторяется, только теперь уже использовано где то 544 МБ памяти и тот же эксепшн вылезает. И при всём этом процесс полностью нагружает одно ядро.
Цифры от раза к разу несколько колебляться, поэтому просьба не воспринимать их как точные

Не пойму, что я делаю неправильно и почему выделяется так много памяти, можно ли это как то оптимизировать?

Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
   //читаю файл
   repeat
     Esheraz:=false;
     try
       FS := TFileStream.Create('\file.dat', fmOpenRead or fmShareExclusive);
     except
       Esheraz:=true;
       sleep(1000);
     end;
   until Esheraz=false;
 
   //записываю FileStream в переменную типа string
   SetLength(buf, FS.Size);
   FS.Read(pointer(buf)^,FS.Size);
   FS.Free;
 
 
   //ОТПРАВКА ФАЙЛА
   IdHTTP1:=TIdHTTP.Create(nil);
   IdHTTP1.HandleRedirects:=true;
   IdHTTP1.ReadTimeout:=6000;
 
   IdHTTP1.Port:=80;
   
   //формирую параметры POST-запроса
   Data := TStringList.Create;
   Data.Add('f=file.dat');
   Data.Add('data='+buf);
 
 
   repeat
   If Esheraz=true then sleep(1000);
   Esheraz:=false;
   try
     read := IdHTTP1.Post('http://address.ru/s.php', Data); //ЗДЕСЬ ВЫЛЕЗАЕТ ИСКЛЮЧЕНИЕ
   except
        Esheraz:=true;
   end;
   until Esheraz=false;
 
   Data.Clear;
   Data.Free;
   IdHTTP1.Free;
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2013, 22:34
Ответы с готовыми решениями:

Работа с большим текстовым файлом
Здравствуйте! Ситуация такая - есть большой текстовый файл - 100.000 строк. Мне нужно читать его...

FileMapping. Работа с большим количеством страниц
Есть следующий код создания FileMapping: procedure TForm1.FormCreate(Sender: TObject); begin ...

POST запрос с большим объёмом данных
Необходимо передать из одной HTML страницы большой массив данных на сервер. Количество данных...

Медленная загрузка ListBox с большим объёмом данных
Добрый день! Возникла такая проблема. Есть программа, написанная на WPF. В ней есть ListBox со...

1
55 / 55 / 8
Регистрация: 06.02.2013
Сообщений: 317
24.12.2013, 10:25 2
в инди есть специально для файлов тип TIdMultipartFormDataStream. Создаёте экземпляр этого класса, добавляете в него файл с помощью AddFile, затем передаёте экземпляр в Post

Добавлено через 49 секунд
порт кста, думаю не надо указывать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2013, 10:25

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Парсинг, регулярные выражения с большим объёмом и многопоточностью
Всем привет, нужна помощь в распарсовке XML документа, документ огромных размеров, все теги и...

Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти?
Какую лучше выбрать видеокарту - с большим объёмом памяти или большими частотами памяти?! Всё...

работа с большим объемом данных
большим я называю от 300000Rx50C судя по информации из диспетчера задач происходит накопление...

Работа с большим объемом данных
Коллеги, подскажите по такому вопросу. Есть выборка, несколько миллионов записей. Каким образом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.