powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточный .csv парсер
66 сообщений из 66, показаны все 3 страниц
Многопоточный .csv парсер
    #39215473
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток)
Суть вопроса думаю понятна из заголовка.

файл .csv содержит строки типа

1455812018,user2, http://ru.wikipedia.org,100
1455812019,user10, http://hh.ru,30
1455812968,user3, http://google.com,60
1455812411,user10, http://hh.ru,90
1455812684,user3, http://vk.com,50
1455839970,user1, http://ru.wikipedia.org,70

нужно распарсить по запятой и записать в другой .csv файл вот таким образом

18-FEB-2016

user2, https://ru.wikipedia.org,100
user3, http://google.com,60
user3, http://vk.com,50
user10, http://hh.ru,60

19-FEB-2016

user1, http://ru.wikipedia.org,70

из первоначальных строк предлагается получить поля класса(date, userID, URL, time).

Я пока что сделал преобразование даты и имею сортированную по userID коллекцию объектов с 4мя стринговыми полями
Содержимое выглядит так

19-фев-2016 user1 http://ru.wikipedia.org 70
18-фев-2016 user2 http://ru.wikipedia.org 100
18-фев-2016 user3 http://google.com 60
18-фев-2016 user3 http://vk.com 50
18-фев-2016 user10 http://hh.ru 30
18-фев-2016 user10 http://hh.ru 90

В случае если userID и URL совпадают, то необходимо посчитать среднее арифметическое(avg) из значений time и записать только 1 объект, содержащий avg.

Также в выходном файле объекты должны быть сортированы по userID.

Если значение "date" в объектах совпадает то делается только 1 запись для этой даты а затем помещаются значения полей для всех объектов, учитывая вышеописанные условия, пока date не получит новое значение.

Затем для всех действий есть такое условие: папка с .csv файлами мониторится на наличие новых файлов. Одновременно в потоках могут обрабатываться до 10 файлов(1 файл = 1поток)(макс. 10 потоков), а остальные файлы должны быть помещены в очередь и начинать обрабатываться первым из освободившихся потоков.

Подскажите с чего начать и в какой последовательности выполнять условия?
Мои попытки пока не увенчались успехами
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215478
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафига?

CSV крайне простой формат, что бы городить многопоточность. IMHO
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215479
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archelite,

Замах на целый многопоточный парсер, а по факту однопоточный. Многопоточный парсер парсит один файл в несколько потоков. Тут у вас тупо запуск однопоточного парсера много раз с раздельными ресурсами.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215508
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archelite,

ИХМО, проще загрузить всё в какую-нибудь СУБД (многие умеют загружать данные из CSV файлов) и написать правильный SELECT по этим данным. А может быть вообще Excel?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215518
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задача парсить логи и они большие, то СУБД может и не справиться за разумное время. AFAIK.

Проще ручками и значительно быстрее (по ресурсам в сотни, тысячи раз).

Только проблемы в производительно совсем не те, что вынесены в заголовок темы. Ну и с учетом, что автор темы думает в концепции ООП ("из первоначальных строк предлагается получить класса", "имею сортированную по userID коллекцию объектов") подозреваю, что на большом массиве входных данных будут проблемы с памятью.

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

IMHO
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215520
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задание состоит именно в парсинге .csv и именно с применением потоков
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215523
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevЕсли задача парсить логи и они большие, то СУБД может и не справиться за разумное время. AFAIK.

Проще ручками и значительно быстрее (по ресурсам в сотни, тысячи раз).

Только проблемы в производительно совсем не те, что вынесены в заголовок темы. Ну и с учетом, что автор темы думает в концепции ООП ("из первоначальных строк предлагается получить класса", "имею сортированную по userID коллекцию объектов") подозреваю, что на большом массиве входных данных будут проблемы с памятью.

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

IMHO

это тестовое задание, я бы и сам переработал структуру выходных данных, так чтобы не ломать голову целый день.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215524
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафига?

Или это студенческое задание на применение потоков. Тогда:
1. Тема плохо названа. Т.к.
BlazkowiczЗамах на целый многопоточный парсер, а по факту однопоточный. Многопоточный парсер парсит один файл в несколько потоков. Тут у вас тупо запуск однопоточного парсера много раз с раздельными ресурсами.
2.
http://www.sql.ru/forum/941371/studentam-zhelaushhim-pomoshhi
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215549
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Спасибо, это не студенческое задание)

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

У меня есть несколько идей.

Сначала в цикле можно вытаскивать поле time и складывать его значение со следующим, в случае если соблюдается условие userID && URL == next userID && URL.

Затем создать объект с новым значением time, удалить из коллекции предыдущие объекты с совпадающими значениями и записать новый.

Затем сортировать по дате, а потом уже что-то придумывать с датой

Сейчас как раз мучаюсь с попыткой получения среднего времени, подскажите как правильно сделать счетчик объектов, которые удовлетворяют условию userID && URL == next userID && URL ?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215585
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archelite, мне лично вообще не понятно, с чем Вы боретесь.

Если я правильно представляю задачу, она сводиться к группировке (по дате) + последующей сортировке (по пользователю).

Первое стандартный HashMap, второе просто стандартный sort. Это если все хранить в оперативной памяти. Если памяти хватает - ну и ладно. Если есть проблемы, тогда нужно будет изгаляться

Дынные в единицы/десятки мегабайт проблем вызывать не должны, а в гигабайты уже наверное можно придумать какой-то более сложный алгоритм. Например процесс разбить на две части. Для каждой даты (даже если 365 дней в году - это не так и много) просто открыть временный файл (+ большой буфер ввода вывода в несколько мегабайт) и писать туда промежуточные данные. Потом вторым проходом отсортировать полученные файлы.

Можно пойти дальше, для каждой даты несколько небольших отсортированных файлов (единицы/десятки Mb), результат сортировать слиянием.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215593
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archelite, смотри. Мультипоточность тебе тут толком не поможет. Потому что узкое
место в этой задаче - последовательное чтение файла. Если ты свой ноут нагрузишь
10/100/1000 потоков CSV парсеров то это не даст производительности.

Мне эта задачка очень напоминает учебные примеры Hadoop/BigData. Там берется
csv файл (обычно в терабайт чтоб мало не показалось) режется на куски (пофиг
какого размера можно даже разного) и кидается в специальное дисковое хранилище
(по архитектуре похоже на RAID5 но суть другая) и дальше ты пишешь логику которая
делает отображение и свёртку. Эту логику деплоишь в хадуп-кластер и она сама находит
кусочки файлов и сворачивает и публикует резалт. Дисковая нагрузка - средняя
из за того что псевдо-случайные потоки получают псевдо-случайный доступ к порциям
твоего CSV файла (а также к его зеркальным копиям).
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215614
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteздесь главное алгоритм парсинга, с потоками проблем возникнуть не должно, я знаю как это сделать в принципе.

Тут почти нет конкурентной многопоточности. Каждый поток читает свой файл. Обрабатывает свои данные и складывает их в БД, которая вполне себе разруливает транзакции. Так?
Единственно что, если вас заботит производительность, то надо учитывать, что если разные потоки пытаются вычитать много разных файлов одновременно, это сильно снижает производительность на дисковых устройствах по сравнению с последовательным чтением одного файла.

И еще у вас проблема с идентификацией парсинга. Парсинг это вычитать 3 значения из строки файла в 3 переменных в памяти. И так для всех строк. На этом парсинг зананчивается. Остальное, это уже обработка данных и бизнес-логика вашего приложения. К парсингу это отношения не имеет.

Поэтому я бы на вашем месте выкинул из задачи слова про потоки и парсинг и сконцентрировался на проблемах с обработкой данных. В чем именно проблема - не понятно. Вы просто расписали как должно быть. Но почему это вызывает затруденения не объяснили.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215625
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etl какой нить. только логику настроить
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215632
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingetl какой нить. только логику настроить
Какой?

В лесу мышей все обижали. Они совершенно не представляли, что с этим делать, пока не решили пойти за советом к Сове как к самому мудрому члену их лесного сообщества. Сова была отзывчива и, немного подумав, сказала: «Вам нужно стать ежиками». «Гениально! – закричали мыши. – Но как же мы ими станем?» «Не знаю, – ответила Сова, – я – стратегический консультант»...

Стратегический консалтинг – серьезно и не очень
http://old.e-xecutive.ru/friday/article_3979/
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215639
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevllemingetl какой нить. только логику настроить
Какой?

Kettle же. Другой за бесплатно еще пойди поищи.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215685
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Вы просто расписали как должно быть. Но почему это вызывает затруденения не объяснили.

Я еще не очень хорошо разбираюсь в Java)

Начнем по порядку
Выше мне подсказали использовать HashMap, я создал HashMap<String, String> в качестве ключа в цикле помещаю, значение date, а в качестве значения конкатенирую строки со значениями остальных полей.
Получился map который содержит 2 пары, но только часть данных в значении.

Пожалуй проще будет, если выложу код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
public class ParseData implements Comparable<ParseData> {
   
    private File inDir = new File("C:\\Users\\User\\Desktop\\tmp"); 
    private File outDir = new File("C:\\Users\\User\\Desktop\\tmp2");
    private File[] files;
    private Scanner sc;
    private String[] stringsBuffer;
    private Date unixDate = new Date();
    private long tmpdate;
    private SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
    private String formattedDate;

    //private ArrayList<ParseData> tmplist = new ArrayList<>();
   // private ArrayList<ParseData> dataList = new ArrayList<>();
    private int avgTime = 0;
    //private StringBuilder sb = new StringBuilder();
    private int counter = 0;
    private HashMap<String, String> map = new HashMap<>();

}

public void parseLogData() {
        
        try {
            if (inDir.exists() && inDir.isDirectory() && inDir.canRead()) {
                files = inDir.listFiles();
                for (File f : files) {
                    if (f.getName().endsWith(".csv")) {
                        sc = new Scanner(f);
                        while (sc.hasNext()) {
                            String next = sc.nextLine();
                            stringsBuffer = next.split(",");
                            tmpdate = (long) (Long.parseLong(stringsBuffer[0])) * 1000;
                            unixDate.setTime(tmpdate);
                            formattedDate = sdf.format(unixDate);
                            for (int i = 0; i < stringsBuffer.length; i++) {
                                stringsBuffer[0] = formattedDate;
                                map.put(stringsBuffer[0], "\n"+stringsBuffer[1]+"\n"+stringsBuffer[2]+"\n"+stringsBuffer[3]+"\n");
                            }
                            
//                          tmplist.add(new ParseData(stringsBuffer[0], stringsBuffer[1], 
//                                                    stringsBuffer[2], stringsBuffer[3]));
                        }                        
                    }                    
                    Set set = map.entrySet();
                    Iterator it = set.iterator();
                    while (it.hasNext()) {
                        Map.Entry me = (Map.Entry) it.next();
                        System.out.println(me.getKey()+""+ me.getValue());                     
                    }
                }
            } else {
                System.err.println("The directory does not exist or you do not have access");
            }
        } catch (FileNotFoundException ex) {
            System.err.println(ex.getMessage());
        }        
    }
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215686
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во вложении готовый проект
kettle взять здесь http://community.pentaho.com/projects/data-integration/
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215692
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteздесь главное алгоритм парсинга, с потоками проблем возникнуть не должно
А с парсингом-то какие проблемы? Читаешь строку, выделяешь первое поле, скидываешь в очередь соответствующему потоку, который уже и выполняет остальной парсинг и запись в нужный файл.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215709
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там правда чуть чуть поменять надо чтобы наименования файлов как нужно было
и кавычки в csv там же можно настроить

а вот sort я забыл добавить
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215714
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteВыше мне подсказали использовать HashMap, я создал HashMap<String, String>...
Я бы делал как-то так:

1. Создаешь класс под данные
Код: sql
1.
2.
3.
4.
5.
class MyData {
    String date;
    String userName;
    String url;
}


2. создаешь HashMap:
Код: sql
1.
HashMap<String, ArrayList<MyData>> map;



3. читаешь входные данные и одновременно группируешь по дням

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
while ( ! eof ) {
   String s = readLine();
   MyData data = parse( s );
   // Группировка
   String k = data.date;
   ArrayList<MyData> v = map.get( k );
   if ( v==null ) {
      v = new ArrayList<MyData>();
      map.put( k, v );
   }
   v.add( data );
}



Данные по датам сгруппированы, уже хорошо.

4. Выводишь данные в порядке userId
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
   // Сортируем получившиеся дни
   ArraList<String> keys = map.
   keys.addAll( map.keys() );
   keys.sort();
   // Выводим данные по дням
   for ( String k : keys ) {
      ArrayList<MyData> list = map.get( k );
      // Сортируем данные в пределах дня
      list.sort();
     // Выводим заголовок
     println( k );
     // Выводим данные для данного дня
      for ( MyData data : list ) {
          println( data.userName + "," + data.url );
      }
   }



...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215718
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteЯ еще не очень хорошо разбираюсь в Java)

А Java тут не при чем. Вам нужен алгоритм решения вашей проблемы. Язык и платформа реализации вторичны.

archeliteНачнем по порядку
Выше мне подсказали использовать HashMap, я создал HashMap<String, String> в качестве ключа в цикле помещаю, значение date, а в качестве значения конкатенирую строки со значениями остальных полей.
Получился map который содержит 2 пары, но только часть данных в значении.
Пожалуй проще будет, если выложу код

Разделите три подзадачи в разные реализации.
1) Мониторить каталог и запускать обработку
2) Парсить CSV в объекты
3) Обрабатывать объекты
4) Экспортировать объекты в нужный формат

Не нужно делать один класс, который реализует все. Это будет "золотой молоток".
Для CSV есть очень клевый парсер Apache Commons CSV
https://commons.apache.org/proper/commons-csv/
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215723
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteВ случае если userID и URL совпадают, то необходимо посчитать среднее арифметическое(avg) из значений time и записать только 1 объект, содержащий avg.

Также в выходном файле объекты должны быть сортированы по userID.

Если значение "date" в объектах совпадает то делается только 1 запись для этой даты а затем помещаются значения полей для всех объектов, учитывая вышеописанные условия, пока date не получит новое значение.

Есть куча стандартных терминов. У вас же вместо них какие-то витьеватные инсинуации формулировки.
"Сгруппировать записи по пользователю". "Агрегировать среднеарифметическое по дате". Так что ли?
Это все реализовано, хоть в SQL, хоть в Java Stream API. Не обязательно самому корячиться на hashmap
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteЯ еще не очень хорошо разбираюсь в Java)

Отложи лучше многопоточность. Вообще забудь. Любая даже самая простая
мультипоточность - завалит тебя на сдаче.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215794
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
class MyData {
    String date;
    String userName;
    String url;
}



а как же время? должно быть еще поле

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
while ( ! eof ) {
   String s = readLine();
   MyData data = parse( s );  в этой строке имеется ввиду получение массива строк?
   // Группировка
   String k = data.date;
   ArrayList<MyData> v = map.get( k );
   if ( v==null ) {
      v = new ArrayList<MyData>();
      map.put( k, v );
   }
   v.add( data );
}



авторРазделите три подзадачи в разные реализации.
1) Мониторить каталог и запускать обработку
2) Парсить CSV в объекты
3) Обрабатывать объекты
4) Экспортировать объекты в нужный формат

Примерно так и хотел сделать, только для каждого пункта не классы а методы.

авторЕсть куча стандартных терминов. У вас же вместо них какие-то витьеватные инсинуации формулировки.
"Сгруппировать записи по пользователю". "Агрегировать среднеарифметическое по дате". Так что ли?
Это все реализовано, хоть в SQL, хоть в Java Stream API. Не обязательно самому корячиться на hashmap

Да всё так, но у меня тестовое задание перед собеседованием, которое нужно написать именно на Java, так что придется корячиться)

Посмотрел про Java Stream API, должно быть классная штука, только совершенно незнакомая)
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215843
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteа как же время? должно быть еще поле

А так же валидация и типизация. Вас что удерживает от того чтобы добавить 4е поле в класс?

Код: java
1.
   MyData data = parse( s );  в этой строке имеется ввиду получение массива строк?


Это псевдо-код чтобы показать идею.

archeliteПримерно так и хотел сделать, только для каждого пункта не классы а методы.

Будет процедурное программирование. Работодатель не оценит.

archeliteДа всё так, но у меня тестовое задание перед собеседованием, которое нужно написать именно на Java, так что придется корячиться)

Так я о терминологии. В задании тоже не слова нет о группировках и агрегациях?

archeliteПосмотрел про Java Stream API, должно быть классная штука, только совершенно незнакомая)
Ах, что же делать.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215851
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это задача для бд
вставка из csv файла в базу - самая быстрая.
а вс остальное с данными база сделает оптимально и быстро.
если есть несколько типов логов - их по своим правилам вносить в базу, тут парсить не надо
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215870
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,


авторТак я о терминологии. В задании тоже не слова нет о группировках и агрегациях?

Нет, оно вообще почему-то на английском) Видимо за одно и уровень владения инглишем проверяют)
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215878
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

да, в задании есть упоминание о том что можно сделать через БД, попробую пожалуй спасибо за наводку
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215917
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteвадя,

да, в задании есть упоминание о том что можно сделать через БД, попробую пожалуй спасибо за наводку
Во-во, я про это ещё с самого утра сказал. По мне, так самый простой путь, я бы именно так и сделал. Если есть проблемы с развёртыванием сервера базы данных, то можно использовать Derby (JavaDB), H2 или SQLite, или ещё какую-нибудь по вашему вкусу.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215933
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickВо-во, я про это ещё с самого утра сказал. По мне, так самый простой путь, я бы именно так и сделал. Если есть проблемы с развёртыванием сервера базы данных, то можно использовать Derby (JavaDB), H2 или SQLite, или ещё какую-нибудь по вашему вкусу.
И, не знаю на счёт SQLite, но Derby и H2 имеют штатные процедуры загрузки данных из CSV файлов. Так что даже CVS парсить не придётся.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215942
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO Задача автора, чуть сложнее пузырьковой сортировки.

Проблема с парсингом CSV - для меня вообще загадка. Где Вы там видите проблему? Весь парсинг в вопросе автора - это вызов одной ф-ции String.split( "," )
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215957
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczarcheliteздесь главное алгоритм парсинга, с потоками проблем возникнуть не должно, я знаю как это сделать в принципе.

Тут почти нет конкурентной многопоточности. Каждый поток читает свой файл. Обрабатывает свои данные и складывает их в БД, которая вполне себе разруливает транзакции. Так?...
Я бы сказал, здесь нет алгоритма парсинга... Что здесь сложного в парсинге?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215978
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

авторПроблема с парсингом CSV - для меня вообще загадка. Где Вы там видите проблему? Весь парсинг в вопросе автора - это вызов одной ф-ции String.split( "," )

Ну я под парсингом понимаю не только считать информацию, но и преобразовать её к нужному виду. Просто разногласия в терминологии.

Вобщем попробовал еще пару мозголомных вариантов, пока без толку.
Сделал только сортировку по userID

Input
1455812018,user2, http://ru.wikipedia.org,100
1455812019,user10, http://hh.ru,30
1455812968,user3, http://google.com,60
1455812411,user10, http://hh.ru,90
1455812684,user3, http://vk.com,50
1455839970,user1, http://ru.wikipedia.org,70
1455812411,user10, http://hh.ru,90

Output
19-фев-2016 user1 http://ru.wikipedia.org 70
18-фев-2016 user2 http://ru.wikipedia.org 100
18-фев-2016 user3 http://google.com 60
18-фев-2016 user3 http://vk.com 50
18-фев-2016 user10 http://hh.ru 30
18-фев-2016 user10 http://hh.ru 90
18-фев-2016 user10 http://hh.ru 90

Должно быть
19-фев-2016

user1 http://ru.wikipedia.org 70

18-фев-2016

user2 http://ru.wikipedia.org 100
user3 http://google.com 60
user3 http://vk.com 50
user10 http://hh.ru 70

Насчет БД, допустим заполню я таблицу своим Output'ом. Можно будет посчитать среднеарифметическое, но как сделать чтобы одной дате соответствовал набор данных?

Мне по сути нужно сделать вот что: в цикле вытаскивать из объекта значение поля data(18-фев-2016) и если следующее значение соответствует первому, то обнулять последующие пока не встретится новое значение, затем цикл повторяется.
Можете привести такой пример пожалуйста?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39215983
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНасчет БД, допустим заполню я таблицу своим Output'ом. Можно будет посчитать среднеарифметическое, но как сделать чтобы одной дате соответствовал набор данных?

Мне по сути нужно сделать вот что: в цикле вытаскивать из объекта значение поля data(18-фев-2016) и если следующее значение соответствует первому, то обнулять последующие пока не встретится новое значение, затем цикл повторяется.
Можете привести такой пример пожалуйста?
это нечто
это где так учат????
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216002
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archelite Можно будет посчитать среднеарифметическое, но как сделать чтобы одной дате соответствовал набор данных?
Не понимаю что вы имеете ввиду. Что за набор данных, соответствующий одной дате? SQL знаете?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216005
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometrЯ бы сказал, здесь нет алгоритма парсинга... Что здесь сложного в парсинге?
Да, все как обычно. Автор вывалил на нас свою интерпретацию задания и не особо удосужился задать конкретные вопросы.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216009
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteСделал только сортировку по userID

Делайте сортировку по паре Date + userID

при выводе, сохраняйте пред. значение заголовка и выводите заголовок только тогда, когда он изменяется
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
String prevDate = "";
for ( MyData data : list ) {
   String curDate = data.date;
   // Если меняется поле группировки - выводим заголовок
   if ( ! prevDate.equals(  curDate ) ) {
      println( curDate );
      prevDate = curDate;
   }
   // Выводим данные
   println( data.userId + "," + data.url );
}
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216017
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteНу я под парсингом понимаю не только считать информацию, но и преобразовать её к нужному виду. Просто разногласия в терминологии.

Ну, вот вам и указывают, что терминологию надо привести к общепринятой. Любой проект начинается с терминологии. Иначе участники просто не смогут договориться. Так вот, парсинг, это преобразование некоторого формата данные в переменные, которые ЯП может оперировать. А последующая обработка этих данных это обработка, а не парсинг.

archeliteВобщем попробовал еще пару мозголомных вариантов, пока без толку.

А вопросы будут или только очередное "ничего не получается"?

archeliteНасчет БД, допустим заполню я таблицу своим Output'ом. Можно будет посчитать среднеарифметическое, но как сделать чтобы одной дате соответствовал набор данных?

Google -> SQL AVG Group by

archeliteМне по сути нужно сделать вот что: в цикле вытаскивать из объекта значение поля data(18-фев-2016) и если следующее значение соответствует первому, то обнулять последующие пока не встретится новое значение, затем цикл повторяется.
Можете привести такой пример пожалуйста?
По сути есть такое понятие группировка. Вы вместо этого емкого понятия описывание то как лично вы решили делать группировку.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216042
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот автору подарочек. Парсер. Юзкейсы гугли. Штука хорошая. Юзаю сам.

http://mvnrepository.com/artifact/org.apache.commons/commons-csv/1.2
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216066
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА вот автору подарочек. Парсер. Юзкейсы гугли. Штука хорошая. Юзаю сам.

http://mvnrepository.com/artifact/org.apache.commons/commons-csv/1.2
Уже два раза про него написал - бестолку. И афтару еще мавен придется освоить 8)

Вот даже пример как в стрим загнать
https://rumianom.pl/rumianom/entry/apache-commons-csv-with-java
А вот тут
http://www.oracle.com/technetwork/articles/java/architect-streams-pt2-2227132.html
про группировку и вычисление среднего. Осталось объединить и в CSVWriter зафигачить.

Но, у меня есть сильное подозрение, что афтара все равно не возьмут. Не те вопросы задает.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216072
archelite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, будут разбираться :)
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216217
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяэто задача для бд
вставка из csv файла в базу - самая быстрая.
а вс остальное с данными база сделает оптимально и быстро.
если есть несколько типов логов - их по своим правилам вносить в базу, тут парсить не надо

Тормоза в этой задаче- диск, БД, сеть.
А парсинг только память жрёт (да, ненадолго, но жрёт)- куча String. А реализации- ещё и StringBuilder'ы создают пачками.
Так что лучше сделать однопоточный парсинг и впилить туда статический StringBuilder- это реально может съэкономить кучу времени.

PS: кстати, если кто-то знает csv парсер/райтер, который минимизирует создание лишних объектов (ценой строгой однопоточности) - скажите, будет полезно. А то приходится костыли писать, с вероятностью попасть на хитрый текст. Я даже String.split боюсь лишний раз дёргать.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216221
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominвадяэто задача для бд
вставка из csv файла в базу - самая быстрая.
а вс остальное с данными база сделает оптимально и быстро.
если есть несколько типов логов - их по своим правилам вносить в базу, тут парсить не надо

Тормоза в этой задаче- диск, БД, сеть.
А парсинг только память жрёт (да, ненадолго, но жрёт)- куча String. А реализации- ещё и StringBuilder'ы создают пачками.
Так что лучше сделать однопоточный парсинг и впилить туда статический StringBuilder- это реально может съэкономить кучу времени.

PS: кстати, если кто-то знает csv парсер/райтер, который минимизирует создание лишних объектов (ценой строгой однопоточности) - скажите, будет полезно. А то приходится костыли писать, с вероятностью попасть на хитрый текст. Я даже String.split боюсь лишний раз дёргать.
если так рассуждать — странно, как работают бд...
диск будет тормозом в случае, если у тебя десятки миллионов записей, а в этом случае java вылетит в out of memory намного раньше. либо придется писать модуль для свопа, что будет костылем. в базах существуют индексы, и пр. вещи для обработки данных, намного более заточенные для этого, чем будет написано на java. так что если не знаешь про базы - не надо грешить на диск..
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216235
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли так рассуждать — странно, как работают бд...
диск будет тормозом в случае, если у тебя десятки миллионов записей, а в этом случае java вылетит в out of memory намного раньше. либо придется писать модуль для свопа, что будет костылем. в базах существуют индексы, и пр. вещи для обработки данных, намного более заточенные для этого, чем будет написано на java. так что если не знаешь про базы - не надо грешить на диск..

Нормально БД работают. Но это не отменяет того факта, что при полном чтении данных тормоз- диск и сеть (а задача автора- именно что полное чтение и неиндексированная запись).

Ещё раз- из цепочки "прочитать csv из файла" - "распарсить csv в набор данных", "записать в БД" тормозом может быть что угодно (сеть может затесаться как на 1м, так и на 3м пункте), но не парс.

Вот сейчас занимаюсь оптимизацие подобной задачи.
А то 1,5 Тб (gz, csv раз в 5-6 больше) парсились 14 часов- непорядок, понимаешь :)
И основное- это минимизировать работу с диском (работа была в несколько проходов).
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216247
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
занесение данных из файла csv в базу является самым быстрым и эффективным. в болишинстве баз есть специальные команды для этого. ничего парсить не надо
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216256
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

только афтару это не пригодится - у него нет такого условия исп-ть бд

я бы посмотрел в сторону Apache Commons CSV и не изобретал лисапет
остальное - дело логики
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216270
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
вот пример для mesql
http://www.mysql.ru/docs/man/LOAD_DATA.html


rema174 ,
вроде можно и с использованием 19057226

Alexey Tomin,
в java есть 11 способов чтения ....
выбери правильный https://habrahabr.ru/company/luxoft/blog/278233/

по поводу работы с базами vs методы на java
поиск в 10 000 000 записях при использовании поле like '%xxx%' and поле like '%ccc%' and...
mysql 5.7.11 - максимальное время 4.5 сек.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216285
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tominвадяесли так рассуждать — странно, как работают бд...
диск будет тормозом в случае, если у тебя десятки миллионов записей, а в этом случае java вылетит в out of memory намного раньше. либо придется писать модуль для свопа, что будет костылем. в базах существуют индексы, и пр. вещи для обработки данных, намного более заточенные для этого, чем будет написано на java. так что если не знаешь про базы - не надо грешить на диск..

Нормально БД работают. Но это не отменяет того факта, что при полном чтении данных тормоз- диск и сеть (а задача автора- именно что полное чтение и неиндексированная запись).

Ещё раз- из цепочки "прочитать csv из файла" - "распарсить csv в набор данных", "записать в БД" тормозом может быть что угодно (сеть может затесаться как на 1м, так и на 3м пункте), но не парс.

Вот сейчас занимаюсь оптимизацие подобной задачи.
А то 1,5 Тб (gz, csv раз в 5-6 больше) парсились 14 часов- непорядок, понимаешь :)
И основное- это минимизировать работу с диском (работа была в несколько проходов).
8 Тб csv с распаковкой, парсингом и вставкой в бд за 14 часов - непорядок?! А за сколько вы хотели?
Просто распаковка из gz столько инфы сколько занимает? Часа 3 на сервере?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216295
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

пропустил ) но я бы все равно делал так как понятнее
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216298
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174вадя,

пропустил ) но я бы все равно делал так как понятнее
аргумент ваский ;)
мне с базой проще
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216301
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golovonometr8 Тб csv с распаковкой, парсингом и вставкой в бд за 14 часов - непорядок?! А за сколько вы хотели?
Просто распаковка из gz столько инфы сколько занимает? Часа 3 на сервере?

Судя по тестам на меньших данных - после моих правок будет 5ч, не более.
Но это хадуп с 84 мапперами и 64 редьюсерами. И логики много.
Но любая логика упирается в диск обычно :)
Ну или память.
Процессор всё одно 80% ждёт память, а то и больше.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216329
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
покажи одну строку из csv
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216381
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли так рассуждать — странно, как работают бд...
диск будет тормозом в случае, если у тебя десятки миллионов записей, а в этом случае java вылетит в out of memory намного раньше. либо придется писать модуль для свопа, что будет костылем. в базах существуют индексы, и пр. вещи для обработки данных, намного более заточенные для этого, чем будет написано на java. так что если не знаешь про базы - не надо грешить на диск..
Есть интересная статья Стоунбрейкера где он ругает мультипоточные DBMS/OLTP и считает что
это архитектурная ошибка.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216606
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteу меня тестовое задание перед собеседованием, которое нужно написать именно на Java
Забей. Этот тест ты завалил. Ищи вакансию попроще.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216642
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще неясно в какую контору он собеседуется. Если там упор делается на
торговые сети к примеру - то соискатель вполне может вывалить решение на
SQL. Это будет обсуждаемый вариант. Если геймдев - то там интересно
будет знания соискателя в коллекциях и мультипоточности.

Я думаю что задача это творческая (наподобие Microsoft-овских Терабайтных
строк-дубликатов которые мы обсуждали недавно) и решать ее можно
как угодно. Главное убедить тех-лида или персону которая проводит
собеседование что ты прав и уверен. А вот уверенности у нашего
поциента как раз нет. Мы можем вывалить на него вагон решений
но вопрос про OutOfMemory error может его срезать на взлете.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216663
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяAlexey Tomin,
покажи одну строку из csv

Зачем? Там 109 полей, из которых больше половины- числа.
"appnexus Standard Feed", если кому-то говорит :D
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216715
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominвадяAlexey Tomin,
покажи одну строку из csv

Зачем? Там 109 полей, из которых больше половины- числа.
"appnexus Standard Feed", если кому-то говорит :D
интересно как эти данные зайдут в mysql
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216823
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё-таки покажи, интересно, что там парсить надо, почему сразу в базу не залить?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39216944
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin ,
http://dev.mysql.com/doc/refman/5.7/en/load-data.html
секция set
в комментах расписано применение
вообще интересно насколько это ускорит
ну а чтоб исключить (почти) влияние диска- надо исходный csv и файлы базы держать на разных физических дисках
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217107
Kenny Fartman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, средства импорта данных из CSV есть в любой нормальной DBMS
но задача не про это. Это задача - на разработку а не на знание
админских утилит.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217151
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kenny Fartman http://www.baeldung.com/java-read-lines-large-file
http://www.coderanch.com/t/201866/Performance/java/Parsing-huge-file-reading-memory
http://stackoverflow.com/questions/9079447/parsing-a-huge-plain-text-file
http://www.quora.com/What-is-the-fastest-way-to-read-a-large-file-in-Java-3-4gb-line-by-line

https://habrahabr.ru/company/luxoft/blog/278233/ - тут примеры с врменем загруки


mayton вадя, средства импорта данных из CSV есть в любой нормальной DBMS
но задача не про это. Это задача - на разработку а не на знание
админских утилит
я уже не о проблеме ТС,
меня интересует задача Alexey Tomin - и вариант её решения с помощью mysql.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217291
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявсё-таки покажи, интересно, что там парсить надо, почему сразу в базу не залить?

В MySQL? Там выжимка грузится- иначе БД треснет.Мы не настолько богаты, чтобы MySQL терабайты гонять- hadoop дешевле выходит.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217336
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archeliteфайл .csv содержит строки типа

1455812018,user2, http://ru.wikipedia.org,100
1455812019,user10, http://hh.ru,30
1455812968,user3, http://google.com,60
1455812411,user10, http://hh.ru,90
1455812684,user3, http://vk.com,50
1455839970,user1, http://ru.wikipedia.org,70 Каков максимальный размер входного файла ?
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217356
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MillisUserNameURL???1455812018user2 http://ru.wikipedia.org 1001455812019user10 http://hh.ru 301455812968user3 http://google.com 601455812411user10 http://hh.ru 901455812684user3 http://vk.com 501455839970user1 http://ru.wikipedia.org 70
Имена пользователей начинаются с префикса user .
Для оптимальности можно их убрать, оставив только номера.
...
Рейтинг: 0 / 0
Многопоточный .csv парсер
    #39217437
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanИмена пользователей начинаются с префикса user .
Для оптимальности можно их убрать, оставив только номера.
имена могут быть любыми, но если повторяются, то афтар усредняет значение по последней колонке
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточный .csv парсер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]