Thread: Обсуждение статей, опубликованных на данном сайте/Как ускорить передачу больших массивов данных

Как ускорить передачу больших массивов данных
Прежде всего надо сократить до минимума такую возможность - запрашивать с сервера только то, что нам надо.
Если же такая необходимость возникла (например передать справочник товара 50000 записей на удаленный компьютер) следует применить некоторые хитрости.

1. Вместо формата XML использовать CVS
В FoxPro есть прекрасная команда      

    m.lctxtfile=lcsettmppath+m.lctable+'.TXT'
    COPY TO (m.lctxtfile) DELIMITED WITH { WITH CHARACTER '}'

(в ней в качестве разделителей надо указать знак, не применяемый в Вашей фирме - я нашел, что '}' как правило не применяется в справочнике товаров)
Далее я создаю таблицу всего с одной записью и вставляю туда полученный файл:

      m.lctable2=SYS(2015)
      m.lctablef2=lcsettmppath+m.lctable2+'.DBF'
      m.lctablef3=lcsettmppath+m.lctable2+'.FPT'
      CREATE TABLE (m.lctablef2) (SPECIAL C(2), body M)
      APPEND BLANK
      REPLACE SPECIAL WITH '{}'
      APPEND MEMO body FROM (UPPER(m.lctxtfile)) OVERWRITE
      DELETE FILE &lctablefn
      DELETE FILE &lctxtfile
      CURSORTOXML(lctable2,"lcXMLa11",1,1,0,"1")
      USE IN &lctable2
      DELETE FILE &lctablef2
      DELETE FILE &lctablef3

Вот этот XML файл уже передается назад клиенту.
Что мы выигрываем?
- длина передаваемого файла значительно меньше
- не тратится время на принимаемой машине на очень долгую операцию получения CURSOR из XML file (иногда даже машина не выполняет такую долгую операцию)
Недостаток:
- жесткая структура передаваемого и принимаемого файла

2. Аналогичен и второй вариант, но в этом случае мы упаковываем архиватором непосредственно тот файл, который мы будем передавать.
Преимущество - сжатие файла приблизительно в 3-4 раза по сравнению с CVS. Недостаток - внешний архиватор.
Код по данному примеру не привожу, так как я не использую данный метод по причине внешнего архиватора - иногда могут быть проблемы при запуске его из Web Servicse....

Если есть вопросы, с готовностью отвечу.



Вопросы еще есть [:)].
Как мне передать структуру курсора, чтобы потом корректно его обработать на стороне клиента? Я попробовал засунуть в xml dbf, полученный с помощью COPY STRUCTURE, все получилось, но теперь XMLTOCURSOR ругается на invalid character в xml строке. И пока в голову ничего путного не приходит...



В общем уже сам разобрался. Если структуру засовывать не в memo, а в blob, то все прекрасно работает [8)].



[QUOTE Dmitry] ... Я попробовал засунуть в xml dbf, полученный с помощью COPY STRUCTURE, все получилось, но теперь XMLTOCURSOR ругается на invalid character в xml строке. И пока в голову ничего путного не приходит...[/QUOTE]
Надо создать таблицу с Memo binary и уже туда сохранить Вашу таблицу - тогда при передаче "ругаться не будет"...

Но проблема передачи больших объемов данных не уйдет, так как в плоских структурах DBF много места расходуется в пустую...



[QUOTE Dmitry]В общем уже сам разобрался. Если структуру засовывать не в memo, а в blob, то все прекрасно работает [8)].[/QUOTE]
Понятно... Пока я отвечал Вы уже сами нашли ответ... Иногда заданный вопрос позволяет мыслить в другом направлении... [:)]



Только что закончил тестовый пример. С помощью данных Вами рекомендаций время выполнения запроса сократилось в 34 раза - внушает однако [:)].



[QUOTE Dmitry]Только что закончил тестовый пример. С помощью данных Вами рекомендаций время выполнения запроса сократилось в 34 раза - внушает однако [:)].[/QUOTE]
Понятно... Просто данную статью я писал на основе того, через что прошел сам и использую в повседневной жизни (как и даю рекомендации на основе практического использования данной технологии)... Кроме того в FoxPro все это очень просто, прозрачно и довольно надежно [8)]

Good luck!



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

CREATE TABLE aaa (SPECIAL C(2), body M NOCPTRANS)