rebol время при загрузке в быстрой последовательности

Я потратил часы, пытаясь понять это, и кажется, что Ребол просто не может этого сделать. Вот программа, которая загружает все изображения с веб-страницы. Было здорово видеть, что я могу написать его в гораздо меньшем количестве строк кода, но производительность ужасна. Rebol истекает после загрузки 4-5 файлов. Таймауты были уменьшены путем добавления wait 5 в конец цикла, но это слишком долго!

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

http://pastebin.com/fTnq8A3m

1
nl ja de

3 ответы

You have a number of errors in your script at http://pastebin.com/fTnq8A3m

Например, у вас есть

write ... read/binary ...

поэтому вы читаете изображение как двоичное, а затем записываете его как текст. Также вы обрабатываете URL-адреса как текст, когда URL-адрес уже существует как URL-адрес! тип данных.

поэтому в

read/binary join http://www.rebol.com/ %image.jpg

соединение там хранит тип данных! неповрежденными. Нет необходимости делать это

read/binary to-url join "http://www.rebol.com/" %image.jpg

Какой размер этих изображений?

Добавление wait 5 не повлияет на загрузку, поскольку вы пытаетесь блокировать синхронную загрузку, а также, поскольку вы используете кнопку, вы будете внутри VID, что тогда означало бы использование ожидания в ожидании.

Другой способ сделать это - настроить обработчик async, а затем начать загрузку, чтобы вы не блокировали графический интерфейс, как сейчас.

2
добавлено

используя REBOL для коммерческих приложений в течение многих лет, большинство из которых требуют сетевого взаимодействия, я могу подтвердить, что сеть REBOL довольно стабильна. на самом деле, он может создавать серверы с месяцами безотказной работы без утечек памяти.

но поскольку у вас есть очень конкретная цель, я подумал, что сделаю небольшое приложение, которое покажет вам, как это можно сделать и работать.

Это определенно работает в R2. Одна из проблем, которые могут возникнуть у вас, - это тайм-ауты сетевых портов, но это произойдет только в том случае, если для загрузки серверов или загружаемых изображений требуется несколько секунд и занимает больше времени, чем 30-секундный тайм-аут по умолчанию.

приложение ниже, использует один URL-адрес в качестве его параметра (вы можете установить его так, как вам нравится ближе к вершине), и он загрузит все , чтобы найти его найденные на странице. он поддерживает http и https, и я тестировал его на нескольких сайтах, таких как wikipedia, bing, поиск изображений Google на нем работает очень хорошо ... скорости загрузки довольно постоянны на каждом сервере. Я добавил скорость отчетов о минимальном gui, чтобы дать вам представление о скорости загрузки.

обратите внимание, что это синхронное приложение, которое просто загружает список изображений ... вы не можете просто добавить gui и ожидать, что он будет запускаться одновременно, поскольку для этого требуется совершенно другая сетевая модель (async http ports), для которой требуется более сложная сеть код.

rebol [
    title: "webpage images downloader example"
    notes: "works with R2 only"
]

; the last page-url is the one to be used... feel free to change this
page-url: http://en.wikipedia.org/wiki/Dog
page-url: https://www.google.com/search?q=dogs&tbm=isch
page-url: http://www.bing.com/images/search?q=dogs&go=&qs=ds

;------
; automatically setup URL-based information
page-dir: copy/part page-url find/last/tail page-url "/"
page-host: copy/part page-url find/tail at page-url 8 "/"

?? page-url
?? page-dir
?? page-host

output-dir: %downloaded-images/  ; save images in a subdir of current-directory
unless exists? output-dir [make-dir output-dir ]

images: []

;------
; read url (expecting an HTML document)
;
; Parse is used to collect and cleanup URLs, make them absolute URLs. 
parse/all read page-url [
    some [
        thru {

если вам не нужен сканер веб-страниц и у вас есть список ручных изображений для захвата, просто замените этот код блоком изображений следующим образом:

images: [ 
    http://server.com/img1.png
    http://server.com/img2.png
    http://server.com/img3.png
]

и пусть цикл загрузки сделает свое дело.

Надеюсь это поможет

2
добавлено
Привет, оба сценария теперь работают, сканер вирусов в моей системе сканирования HTTP-подключений каким-то образом вызывают таймауты. После его отключения все отлично работало и довольно быстро. Программа, написанная на C, не была выполнена, потому что она не использовала HTTP для загрузки. Ребол не имел к этому никакого отношения, сэр. Я сохранил ваш скрипт для будущей ссылки и пометил поток для удаления.
добавлено автор user2020783, источник

Нужно ли долго ждать? В длинных циклах rebol нужно ждать, а затем обрабатывать gui-события, но IIRC wait 0 должен делать трюк. Возможно ли, что возникновение событий создает проблемы?

1
добавлено