|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.05.2019, 21:16 | #1 |
Пользователь
Регистрация: 01.12.2015
Сообщений: 82
|
передача больших файлов по сети
Всем привет, не могу понять что происходит.
На основе примеров из сети организовал у себя передачу файлов через сокеты. Файлы до 500 МБ передаются отлично, без сбоев. Файл размеров в 700 МБ передается на клиент (служба виндовс), клиент распухает в 639 МБ озу и все, дальше дело не идет. Отправляю так: Код:
Код:
целочисленные переменные вроде везде int64... В чем еще проблема может быть? Embarcadero® Delphi 10.3 Version 26.0.32429.4364 Последний раз редактировалось niockasd; 04.05.2019 в 21:47. |
04.05.2019, 21:49 | #2 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Чтобы клиент не распухал нужно сразу на диск писать файл лучше использовать File через BlockWrite
Либо кусками через TMemoryStream принял почистил перешел в конец файла и так далее но это геморойно примерно так на вашем примере Код:
Последний раз редактировалось Aliens_wolfs; 04.05.2019 в 22:59. |
04.05.2019, 22:00 | #3 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
В ОС память фрагментирована. На границе 1400 мб весит виндовая библиотека. Поэтому ваша программа не может выделить память больше чем 1400 Мб. А когда скачивается поток возникает необходимость релоцировать память под поток TMemoryStream. Что такое релокация? Это изменение размера выделенной памяти. Т.е. для потока выделено 700 мб вы записали все 700 мб и вам нужно записать следующий байт. Системная библиотека выделяет на 1 мб больше - 701 мб. Затем копирует 700 мб от старого участка и освобождает старую память и до записывает следующий байт. Но при 700 мб занятых ваша программа не может дополнительно выделить 701 мб. Так как 700+701=1401 мб что больше 1400 мб, то системная библиотека возвращает ошибку Out of Memory. А пользовательское пространство для 32 битных программ ограниченно 2 Гб. Остальные 2Гб отведены для ядра ОС.
У вас два выхода: 1) Компилировать под платформу 64 бита 2) Передавать по частям и писать в файл принятые части.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
04.05.2019, 22:02 | #4 |
Пользователь
Регистрация: 01.12.2015
Сообщений: 82
|
ну вообще да...
но конкретно в данном случае из-за чего проблема? Тут виснит не от нехватки озу, 60% заполненность... |
04.05.2019, 22:26 | #5 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Какая Delphi у вас?
А так если хотите работать уже с имеющимися занимаемыми объемами памяти то Если XE то Зайдите в Tools->Options->Editor Options->Undo Limit = поставьте более высокое значение это лимит по использованию памяти Delphi В D7 то Зайдите в Tools->Editor Propertioes->вкладка General->Undo Limit Последний раз редактировалось Aliens_wolfs; 04.05.2019 в 22:34. |
04.05.2019, 22:35 | #6 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Так это не важно. Системная библиотека ищет непрерывный участок из 701 мб. Ей не важно что 1400 мб свободно. Она смотрит и видит что это 2 по 700 мб. Поэтому она и не может выделить память. И как следствие выдаёт ошибку.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
04.05.2019, 22:52 | #7 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Сразу на диск записывайте в посте #2 я из вашего примера пример накидал и будет вам счастье, а то вы в память все принимаете конечно она растет.
Я через BlockWrite более 2гб принимал а память была неизменной Последний раз редактировалось Aliens_wolfs; 04.05.2019 в 23:00. |
04.05.2019, 22:59 | #8 | |
Пользователь
Регистрация: 01.12.2015
Сообщений: 82
|
Цитата:
|
|
04.05.2019, 23:02 | #9 | |
Пользователь
Регистрация: 01.12.2015
Сообщений: 82
|
Цитата:
Пытаюсь понять как его прикрутить, судя по всему проблема где то в процедуре Writing. У меня же там проверка идет (FileTrasfer_MS.Size = FileTrasfer_Size ) а в данном случае я так понял эта переменная не заполняется и следовательно условие не исполняется.. Как теперь эту процедуру обновить? ) |
|
04.05.2019, 23:02 | #10 | |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Найдите у себя в Delphi в настройках Undo Limit.
Цитата:
Проверку сделать можно так либо до 1-гига так fileSize(FFile) = FileTrasfer_Size либо для всех объемов вот эта функция Код:
SizeFilesEx(FFile) = FileTrasfer_Size Последний раз редактировалось Aliens_wolfs; 04.05.2019 в 23:39. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C# передача файлов в сети | TaTT DoGG | Помощь студентам | 20 | 02.04.2017 15:53 |
Передача файлов по сети | Shouldercannon | Работа с сетью в Delphi | 0 | 19.01.2016 15:30 |
передача файлов по сети | SPD | Общие вопросы Delphi | 7 | 10.06.2011 00:24 |
Передача больших файлов чрез сокет | D_E_N | Работа с сетью в Delphi | 0 | 18.01.2010 19:17 |
Передача файлов по сети | SL1CK | Работа с сетью в Delphi | 3 | 05.12.2009 00:08 |