Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка на лету, данные с сети обрабатывать по мере возмо 
V
    Опции темы
Platon
Дата 17.6.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Здравствуйте, уважаемые.

Мысль у меня не шелохнется. Каким образом оптимально сконструировать следующее.
Есть поток байт соединения, соединение медленное, данные капают медленно. Есть регулярное выражение, извлекающее из таблицы записи.
Теоретически у меня получается "метод окна", т.е. я знаю, что максимальная длина записи, подходящая регулярному выражению, равна N символов. По методу окна я должен взять 2N байт, чтобы гарантировано увидеть в этом окне хотя бы 1 запись. Остается только понять, как можно оптимально, без нагрузки, обработать информацию, заключенную в рамку? Постоянно складывать строки - дело тугое.
Имеем InputStreamReader, имеем StringWriter.

На текущий момент реализована только скачка всей страницы, и проход регулярным выражением. Это меня не устраивает.
Большое спасибо за помощь.
PM MAIL ICQ   Вверх
Platon
Дата 17.6.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Я что-то непонятно объяснил? Такой возможности нет? Пишите в любом случае.
PM MAIL ICQ   Вверх
COVD
Дата 17.6.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Я не совсем понял, или, точнее, совсем не понял  smile  что вы делаете. Есть окна "скользящие", и есть "скачущие". Вы, наверное, про "скачущее". Таблица - это ваши данные, скачанные из интернета?
PM MAIL   Вверх
Platon
Дата 17.6.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



COVD, спасибо за отклик.

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

Цитата(Platon @  17.6.2008,  14:52 Найти цитируемый пост)
Есть регулярное выражение, извлекающее из таблицы записи.

Таблица - это таблица на сайте.
Код

<table>
<tr><td></td></tr>
</table>


Еще раз. Проблема заключается в том, что, если на странице K записей, нам придется делать столько же манипуляций со строками. Сейчас попробую реализовать ту версию, которую могу.
PM MAIL ICQ   Вверх
COVD
Дата 17.6.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Если надо извлекать записи, то я бы сначала решал задачу выделения из текста записи (по наличию точки или html тага, если запись - то, что между тагами <td></td>). Когда запись получена клал бы ее в BlockingQueue. А другим потоком извлекал из очереди записи и анализировал их регулярным выражением или чем-то еще.

Это сообщение отредактировал(а) COVD - 17.6.2008, 16:43
PM MAIL   Вверх
Platon
Дата 17.6.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Вот я тут набросал, что имел ввиду.

Код

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WindowSlide {

    private static Pattern PATTERN = Pattern.compile("<tr><td>(.+)</td></tr>");

    private static int MAX_TEMPLATE_SIZE = 125;

    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(new FileInputStream("c:/www/home/htdocs/1.txt"), "CP1251");
        char[] buffer = new char[2*MAX_TEMPLATE_SIZE];
        int shift = buffer.length;
        int screen = 0;
        int am;
        while ((am = reader.read(buffer, buffer.length - shift, shift)) != -1) {
            // Первая могилка: чрезмерная работа с массивом
            screen += am;
            String s = new String(buffer, 0, screen);
            Matcher m = PATTERN.matcher(s);
            if (m.find()) {
                // Нашли, сдвигаем в конец найденого
                System.out.println(m.group());
                shift = m.end();
            }
            else {
                // не нашли, значит смело можем двигать в полокна
                shift = MAX_TEMPLATE_SIZE;
            }
            screen -= shift;
            // Эхо первой могилки, чрезмерная работа с массивом
            System.arraycopy(buffer, shift, buffer, 0, buffer.length - shift);
        }
        // Окончательный аккорд обработать все оставшиеся записи:
        String s = new String(buffer, 0, screen);
        Matcher m = PATTERN.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}


Добавлено через 52 секунды
В качестве теста:

Код

wef wkejfwae
fwaefkj waklgrjaewr
gergkl;j esklrgjerg
ergj eslkrgjserg
ergekls;jr gklesjrg
e
<table>
<tr><td>Первая строка</td></tr>
<tr><td>Вторая строка</td></tr>
<tr><td>Третья строка</td></tr>
<tr><td>Четвертая ооооооооооооооочень длинная строка</td></tr>
<tr><td>Пятая строчка</td></tr>
<tr><td>Я молодец</td></tr>
<tr><td>Достала меня эта экранная функция</td></tr>
</table>

PM MAIL ICQ   Вверх
Platon
Дата 17.6.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Сейчас я продемонстрирую вам феноменальные резултаты!
PM MAIL ICQ   Вверх
Platon
Дата 17.6.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата

Time for screen string: 1125 ms
Time for screen string: 875 ms
Time for screen string: 891 ms
Time for screen string: 844 ms
Time for screen string: 922 ms
Time for screen string: 984 ms
Time for screen string: 859 ms
Time for screen string: 891 ms
Time for screen string: 875 ms
Time for screen string: 906 ms
AVG for screen string: 917 ms
Time for simple string: 1141 ms
Time for simple string: 1031 ms
Time for simple string: 906 ms
Time for simple string: 921 ms
Time for simple string: 937 ms
Time for simple string: 938 ms
Time for simple string: 985 ms
Time for simple string: 969 ms
Time for simple string: 953 ms
Time for simple string: 922 ms
AVG for simple string: 970 ms


Ошеломительный результат, который отражает не единичный случай, запускал много раз.
Сгенерировал файл весом 5М.

Вот тестовый код:

Код

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ScreenSlide {

    private static Pattern PATTERN = Pattern.compile("<tr><td>(.+)</td></tr>");

    private static int MAX_TEMPLATE_SIZE = 2000;
    private static final int TESTS_AMOUNT = 10;

    public static long getScreenSearchTime() throws IOException {
        InputStreamReader reader = new InputStreamReader(new FileInputStream("c:/www/home/htdocs/1.txt"), "CP1251");
        char[] buffer = new char[2*MAX_TEMPLATE_SIZE];
        int shift = buffer.length;
        int screen = 0;
        int am;
        int cnt = 0;
        long t1 = System.currentTimeMillis();
        while ((am = reader.read(buffer, buffer.length - shift, shift)) != -1) {
            // Первая могилка: чрезмерная работа с массивом
            screen += am;
            String s = new String(buffer, 0, screen);
            Matcher m = PATTERN.matcher(s);
            int lastC = cnt;
            while (m.find()) {
                // Нашли, сдвигаем в конец найденого
                //System.out.println(++cnt + ": " + m.group());
                cnt++;
                shift = m.end();
            }
            if (lastC == cnt) {
                // не нашли, значит смело можем двигать в полокна
                shift = MAX_TEMPLATE_SIZE;
            }
            screen -= shift;
            // Эхо первой могилки, чрезмерная работа с массивом
            System.arraycopy(buffer, shift, buffer, 0, buffer.length - shift);
        }
        // Окончательный аккорд обработать все оставшиеся записи:
        String s = new String(buffer, 0, screen);
        Matcher m = PATTERN.matcher(s);
        while (m.find()) {
            cnt++;
            //System.out.println(m.group());
        }
        long t2 = System.currentTimeMillis();
        reader.close();
        //System.out.println(cnt);
        return t2 - t1;
    }

    public static long getSimpleStringSearchTime() throws IOException {
        int cnt = 0;
        char[] buffer = new char[MAX_TEMPLATE_SIZE*2];
        InputStreamReader reader = new InputStreamReader(new FileInputStream("c:/www/home/htdocs/1.txt"), "CP1251");
        StringWriter w = new StringWriter(2500000);
        int am;
        long t1 = System.currentTimeMillis();
        while ((am = reader.read(buffer)) != -1) {
            w.write(buffer, 0, am);
        }
        String s = w.toString();
        Matcher m = PATTERN.matcher(s);
        while (m.find()) {
            cnt++;
        }
        //System.out.println(cnt);
        long t2 = System.currentTimeMillis();
        return t2 - t1;
    }


    public static void main(String[] args) throws IOException {

        long dt = 0;
        for (int i = 0; i < TESTS_AMOUNT; i++) {
            System.gc();
            long t = getScreenSearchTime();
            System.out.println("Time for screen string: " + t + " ms");
            dt += t;
        }
        System.out.println("AVG for screen string: " + dt/10 + " ms");

        dt = 0;
        for (int i = 0; i < TESTS_AMOUNT; i++) {
            System.gc();
            long t = getSimpleStringSearchTime();
            System.out.println("Time for simple string: " + t + " ms");
            dt += t;
        }
        System.out.println("AVG for simple string: " + dt/10 + " ms");
    }
}

Выходит, что на лету не только пользователевыгодно, но и экономично!

Добавлено через 2 минуты и 24 секунды
С нетерпением жду комментариев!

Добавлено через 9 минут и 19 секунд
Нашел погреху. Если StringWriter выделить достаточно памяти, к примеру 7MB, то результат становится закономерным:

Цитата

Time for screen string: 1062 ms
Time for screen string: 828 ms
Time for screen string: 828 ms
Time for screen string: 782 ms
Time for screen string: 813 ms
Time for screen string: 797 ms
Time for screen string: 812 ms
Time for screen string: 765 ms
Time for screen string: 781 ms
Time for screen string: 782 ms
AVG for screen string: 825 ms
Time for simple string: 875 ms
Time for simple string: 796 ms
Time for simple string: 688 ms
Time for simple string: 750 ms
Time for simple string: 734 ms
Time for simple string: 703 ms
Time for simple string: 719 ms
Time for simple string: 688 ms
Time for simple string: 703 ms
Time for simple string: 734 ms
AVG for simple string: 739 ms


Это сообщение отредактировал(а) Platon - 17.6.2008, 17:56
PM MAIL ICQ   Вверх
COVD
Дата 17.6.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



 smile 
PM MAIL   Вверх
Platon
Дата 17.6.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Так, вот это я сейчас не понял, к чему большой палец относится?
PM MAIL ICQ   Вверх
COVD
Дата 17.6.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Так, вот это я сейчас не понял, к чему большой палец относится? 


К успеху в целом. А по сути трудно комментировать, т.к. все же я не в теме. Вы писали, что данные капают медленно из интернета. И тестируете скорость обработки данных .. из файла? Как я понимаю, эксперимент еще не окончен?

Это сообщение отредактировал(а) COVD - 17.6.2008, 18:36
PM MAIL   Вверх
Platon
Дата 17.6.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Безусловно. Тест с "окном" продемонстрировал весьма неплохие результаты на локальной машине, 10-15% весьма приемлемая цена. Более того, как вы правильно подметили, через интернет эта разница должна испариться.
Очень красиво выглядит. Ты видишь как постепенно обработанные результаты сливаются на консоль. ^_^
COVD, спасибо за моральную поддержку. Полдня ждал, ответа, в итоге сам дошел.

Это сообщение отредактировал(а) Platon - 18.6.2008, 17:31
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1022 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.