Вверх ↑
Этот топик читают: Гость
Ответов: 1341
Рейтинг: 31
#1: 2018-08-10 18:20:38 ЛС | профиль | цитата
Возник вопрос, как скачивать большие файлы через http, если сохранять через него же, то на слабых ссдшниках переполнение происходит и тормоза начинаются в ФС, а если через предварительную загрузку в память, а после выгрузку на диск, то при большом файлике свыше 500мб, краш приложения.

Вопрос в том, как грузить в память по 100мб а после сбрасывать в файл, дабы не создавать кучищу записей на диск, каждый байт ну и память не нагружать.
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 1924
Рейтинг: 172
#2: 2018-08-11 14:40:39 ЛС | профиль | цитата
Rysik, попробуй так:

Add(HTTP_Get,3229826,196,252)
{
link(onDownload,15036042:doCopy,[])
}
Add(MemoryStream,15036042,357,259)
{
link(onCopy,5133622:doCopy,[])
}
Add(StreamCopy,5133622,406,259)
{
link(onCopy,2036154:doEvent1,[])
link(Dest,14453390:Var2,[])
link(Source,15036042:Stream,[(419,247)(391,247)(391,303)(363,303)])
link(Count,15036042:Size,[(426,247)(398,247)(398,303)(370,303)])
}
Add(MemoryStream,13873446,406,154)
{
}
Add(Hub,2036154,455,259)
{
link(onEvent1,15756565:In,[])
link(onEvent2,7864986:doCompare,[])
}
Add(LineBreak,8216605,315,266)
{
link(Out,15036042:doClear,[])
Primary=[15756565,420,-7]
}
Add(If_else,7864986,483,266)
{
Type=4
Op2=Integer(104857600)
link(onTrue,8386480:doEvent1,[])
link(Op1,13873446:Size,[(489,226)(419,226)])
}
Add(FileStream,893244,686,266)
{
Mode=2
AutoCopy=0
Point(doCopyFromStream)
}
Add(DoData,6815358,616,266)
{
link(onEventData,893244:doCopyFromStream,[(667,272)(667,286)])
link(Data,14453390:Var3,[(622,236)])
}
Add(GetDataEx,14453390,406,231)
{
link(Data,13873446:Stream,[])
}
Add(Hub,8386480,532,266)
{
link(onEvent1,6815358:doData,[])
link(onEvent2,5102973:In,[])
}
Add(LineBreak,10862389,364,161)
{
link(Out,13873446:doClear,[])
Primary=[5102973,196,112]
}

Но я не проверял досконально, так что, возможно, придётся поиграть со свойствами компонентов.
карма: 9
0
Ответов: 1341
Рейтинг: 31
#3: 2018-08-12 10:04:40 ЛС | профиль | цитата
3042, Ничего не происходит

Редактировалось 1 раз(а), последний 2018-08-12 10:05:18
карма: 2

0
Ответов: 1924
Рейтинг: 172
#4: 2018-08-13 12:14:04 ЛС | профиль | цитата
Rysik, похоже, так не получится, т.к. компонент сразу скачивает весь файл.
Придётся поиграть с Position/Length компонента HTTP_Get. Вот скачивание первых 1024 байт:

Add(HTTP_Get,3229826,413,266)
{
Length=1024
Point(Length)
link(onDownload,893244:doCopyFromStream,[])
link(onStop,2685439:doMessage,[(461,293)(461,335)])
link(Position,12306481:Value,[])
link(Length,10867862:Value,[])
}
Add(FileStream,893244,483,259)
{
FileName="C:\\1.html"
Mode=2
AutoCopy=0
Point(doCopyFromStream)
}
Add(Button,15637229,350,266)
{
Left=25
Top=20
link(onClick,3229826:doDownload,[])
}
Add(Message,2685439,476,329)
{
}
Add(Memory,10867862,434,189)
{
Default=Integer(1024)
}
Add(Memory,12306481,427,133)
{
Default=Integer(1)
}
карма: 9
0
Ответов: 1341
Рейтинг: 31
#5: 2018-08-13 14:42:53 ЛС | профиль | цитата
Оказывается всё намного проще))), нужно просто в исходнике компонента, указать буффер не 1024 байт а поболее))) (это отличная оптимизация к скорость закачки больших файлов!)

отличным решением было использовать модифицированный компонент от NetSpirit, версии 1.3, изменив строку:

  BUFFER_SIZE = 50*1024*1024; //10*1024  ВЫГРУЖАТЬ НА ДИСК ПО 50 МБ

Редактировалось 1 раз(а), последний 2018-08-13 14:55:23
карма: 2

0
Ответов: 1924
Рейтинг: 172
#6: 2018-08-13 15:01:46 ЛС | профиль | цитата
А ещё лучше добавить свойство компонента, чтоб указывать размер самому.
ps. В код я как-то не лазил, хотел на имеющихся свойствах прокатить.
карма: 9
0
Ответов: 286
Рейтинг: 5
#7: 2018-08-13 15:50:07 ЛС | профиль | цитата
Rysik Вы имеете ввиду компонент HTTPClient
карма: 0

0
Ответов: 1341
Рейтинг: 31
#8: 2018-08-13 16:04:00 ЛС | профиль | цитата
Udokanec писал(а):
Rysik Вы имеете ввиду компонент HTTPClient


да, его модифицированную версию

3042 писал(а):
А ещё лучше добавить свойство компонента, чтоб указывать размер самому.

да, но лучше пожалуй штатный компонент полностью заменить на модифицированный от NetSpirit, и добавить туда такое свойство
карма: 2

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)