Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Запись файла в несколько потоков Добавлено: 25.12.05 20:55  

Автор вопроса:  mrNikolas | ICQ: 125478035 
все знают FlashGet и как он закачивает файло.
Есть временный файл размер которого равен ответу ftp или HTTP сервера а затем туда укладываются скачанные байты.
В общих чертах какой самый оптимальный алгоритм создания, доступа и записи файла из пяти одновременно качающих потоков?

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #1 Добавлено: 25.12.05 22:34
Ну дык... на пять частей файл делится и качается.

Ответить

Номер ответа: 2
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #2 Добавлено: 25.12.05 23:19
Какой алгоритм самый оптимальный - никто не скажет. Зависит от многих факторов, связанных с сетью, начиная от качества линии и заканчивая загрузкой серверов на маршруте до url.
А вообще количество потоков обычно делается в пределах 5 - 15.
Сам алгоритм простой:
1.Определяешь размер файла, делишь на n (кол-во потоков)
2.В соответствии с получившимся значением, каждый поток устанавливает для себя FilePointer на нужное значение и качает свою определенную порцию файла в свой буфер.
3.Когда все потоки закончили работу, n буферов склеиваешь в один и пишешь в файл. Можно сделать каждому потоку свой временный файл, а по окончании работы всех потоков слепить n файлов в один.

Ответить

Номер ответа: 3
Автор ответа:
 mrNikolas



ICQ: 125478035 

Вопросов: 4
Ответов: 9
 Профиль | | #3 Добавлено: 25.12.05 23:37
если это алгоритм...то спасибо

Ответить

Номер ответа: 4
Автор ответа:
 mrNikolas



ICQ: 125478035 

Вопросов: 4
Ответов: 9
 Профиль | | #4 Добавлено: 25.12.05 23:58

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

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 26.12.05 00:29
да насыпом он в файл пишет, метки там у него свои, типа это первая чать, это десятая, и свободно после десятой может быть вторая, третья... а как все докачались, собирает нормальный файл

Ответить

Номер ответа: 6
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #6
Добавлено: 26.12.05 00:50
Там временный файл создается того размера, что и качаем, изначатьно допустим из одних нулей. Плюс, по-моему, заголовочная или хвостовая часть описывает откуда чего качаем, сколько потоков и какой откуда докуда прокачал. Так вот, закачка идёт в память для каждого потока в пределах определённого буфера. Периодически, скажем раз в 30 секунд открывается файл для записи, в цикле перебираются буферы под закачку и в зависимсти от результатов закачки поочередно НОВЫЕ данные пишутся в файл с нужным смещением. Для каждого потока, который записали, буфер обнуляется, новые данные снова пишутся в буфер с нуля. В конце всех манипляций файл закрывается и пошли по новой..

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 26.12.05 07:41
Обычно не имеет смысла качать с одного и того же сервера в несколько потоков. Медленнее получается.
Разделение на потоки во flashget придумано для того, чтобы качать куски одного файла с разных зеркал. Вот тогда есть большой прирост скорости.

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 26.12.05 08:28
Если ты качаешь асинхронными сокетами, то ты получаешь сообщение вместе с пакетом и пишешь его данные куда надо и при этом ни разу не возникает ситуация, когда тебе надо записать одновременно в несколько мест. Если же ты качаешь в нескольких тредах, то запись в файл нужно проводить либо асинхронно, с помощью структуры OVERLAPPED, либо юзать EnterCriticalSection - LeaveCriticalSection

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам