Страница: 1 |
Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #8
Добавлено: 26.12.05 08:28
Если ты качаешь асинхронными сокетами, то ты получаешь сообщение вместе с пакетом и пишешь его данные куда надо и при этом ни разу не возникает ситуация, когда тебе надо записать одновременно в несколько мест. Если же ты качаешь в нескольких тредах, то запись в файл нужно проводить либо асинхронно, с помощью структуры OVERLAPPED, либо юзать EnterCriticalSection - LeaveCriticalSection