BG Development


Страници: (19) 1 2 [3] 4 5 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> На кой му се играе на "big data scientist"?, задачка-закачка за големи
SuN
Публикувано на: 13-11-2018, 01:25
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 7344
Регистриран на: 27.01.05



Неизвестно е колко такива има. Повечето са разпръснати със сигурност.


--------------------
Копирай лесно ударено и - ѝ Ѝ
Замърсяване на въздуха в София - http://aqicn.org/city/bulgaria/sofia/druzhba/
PMEmail Poster
Top
stewie
Публикувано на: 13-11-2018, 01:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4527
Регистриран на: 14.07.16



QUOTE (sieg @ 13-11-2018, 01:19)
CODE
class PMData
   {
       public int SensorId { get; set; }

       public string SensorType { get; set; }

       public string Location { get; set; }

       public double Latitue { get; set; }

       public double Longitude { get; set; }

       public DateTime Timestamp { get; set; }

       public double P1 { get; set; }

       public double P2 { get; set; }

       public static PMData FromCsvLine(string s)
       {
           var fields = s.Split(';');
           try
           {
               return new PMData
               {
                   SensorId = int.Parse(fields[0]),
                   SensorType = fields[1],
                   Location = fields[2],
                   Latitue = double.Parse(fields[3]),
                   Longitude = double.Parse(fields[4]),
                   Timestamp = DateTime.ParseExact(fields[5], "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture),
                   P1 = double.Parse(fields[6]),
                   P2 = double.Parse(fields[9])
               };
           }
           catch
           {
               return null;
           }
       }
   }

static void Main(string[] args)
       {
           var fileLines = File.ReadLines("D:\\2018-10_sds011\\data.csv").Skip(1);
           var data = fileLines.Select(PMData.FromCsvLine).Where(d => d != null);

           var stats = data.Aggregate(
               new
               {
                   LowestMomentP1 = (DateTime?) null,
                   LowestValueP1 = (double?) null,
                   HighestMomentP1 = (DateTime?) null,
                   HighestValueP1 = (double?) null,
                   LowestMomentP2 = (DateTime?) null,
                   LowestValueP2 = (double?) null,
                   HighestMomentP2 = (DateTime?) null,
                   HighestValueP2 = (double?) null,
                   Count = 0
               },
               (acc, d) => new
               {
                   LowestMomentP1 = !acc.LowestMomentP1.HasValue || acc.LowestValueP1 > d.P1 ? d.Timestamp : acc.LowestMomentP1,
                   LowestValueP1 = !acc.LowestValueP1.HasValue || acc.LowestValueP1 > d.P1 ? d.P1 : acc.LowestValueP1,
                   HighestMomentP1 = !acc.HighestMomentP1.HasValue || acc.HighestValueP1 < d.P1 ? d.Timestamp : acc.HighestMomentP1,
                   HighestValueP1 = !acc.HighestValueP1.HasValue || acc.HighestValueP1 < d.P1 ? d.P1 : acc.HighestValueP1,
                   LowestMomentP2 = !acc.LowestMomentP2.HasValue || acc.LowestValueP2 > d.P2 ? d.Timestamp : acc.LowestMomentP2,
                   LowestValueP2 = !acc.LowestValueP2.HasValue || acc.LowestValueP2 > d.P2 ? d.P2 : acc.LowestValueP2,
                   HighestMomentP2 = !acc.HighestMomentP2.HasValue || acc.HighestValueP2 < d.P2 ? d.Timestamp : acc.HighestMomentP2,
                   HighestValueP2 = !acc.HighestValueP2.HasValue || acc.HighestValueP2 < d.P2 ? d.P2 : acc.HighestValueP2,
                   Count = acc.Count + 1
               });

           Console.WriteLine(stats);
       }


За толкова време - толкова. Има прецакани данни. Агрегацията по часове, дни и седмици, остава за домашно.

Колега, File.ReadLines не е ли малко несериозно за големи файлове ? Файлът трябва да се пусне през бач блок, на който му се подава буфер от файла , процесва както си описал (аз не съм гледал структурата, понеже не е важна за заданието) и съответно да трупа я в паметта, я в някой nosql.
PM
Top
H_A_L_F
Публикувано на: 13-11-2018, 01:44
Quote Post



Име: Антон Банчев
Група: Потребител
Ранг: Почетен член

Мнения: 1497
Регистриран на: 01.03.04



С доста прост код ми отнема 75 секунди на много бавен лаптоп да обработя целия файл. Вадя само най-високите и най-ниските стойности, смятам средни дневни стойности за двете променливи... Абе не е супер сложно, но въпроса е каква информация му трябва на човек.

А за рам ползва около 1.5г рам, понеже чете буферирано в пакети от по 512мб.


CODE

import java.io.*;

public class Main {

   public static void main(String[] args) {

       System.out.println("working in "+System.getProperty("user.dir"));
       String testData = "sensor_id;sensor_type;location;lat;lon;timestamp;P1;durP1;ratioP1;P2;durP2;ratioP2\n" +
               "13335;SDS011;6737;51.479;11.962;2018-10-01T00:00:00;10.33;;;5.10;;\n" +
               "2352;SDS011;1187;51.535;6.920;2018-10-01T00:00:00;11.05;;;8.30;;\n" +
               "10458;SDS011;5277;48.722;8.736;2018-10-01T00:00:00;11.43;;;8.67;;\n" +
               "9290;SDS011;4684;42.646;23.383;2018-10-01T00:00:00;11.60;;;1.73;;\n" +
               "11580;SDS011;5846;50.916;4.920;2018-10-01T00:00:00;12.20;;;9.27;;\n" +
               "7450;SDS011;3767;42.688;23.360;2018-10-02T00:00:00;1.30;;;1.03;;\n" +
               "4933;SDS011;2482;49.155;8.253;2018-10-01T00:00:00;14.97;;;4.97;;";


//        Reader reader = new StringReader(testData);
       Reader reader = null;
       try {
           reader = new FileReader("2018-10_sds011.csv");
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       }


       BufferedReader bufferedReader = new BufferedReader(reader, 1024*1024*512);//512mb at once
       try {
           bufferedReader.readLine();//skip one
       } catch (IOException e) {
           e.printStackTrace();
       }

       float maxV1 = Float.MIN_VALUE;//p1
       float minV1 = Float.MAX_VALUE;

       float maxV2 = Float.MIN_VALUE;//p2
       float minV2 = Float.MAX_VALUE;


       int totalRecords = 0;
       float[] dailyAveragesV1 = new float[32];
       float[] dailyAveragesV2 = new float[32];
       int[] dailyCountV1 = new int[32];
       int[] dailyCountV2 = new int[32];

       long start = System.currentTimeMillis();
       String nextLine;
       try {
           while ((nextLine = bufferedReader.readLine()) != null) {
               totalRecords++;
               //p1 - 6
               //p2 - 9
               //timestamp - 5 (2018-10-01T00:00:00)

               String[] values = nextLine.split(";");
               int day = Integer.parseInt(values[5].substring(8,10));

               try {
                   float curV2 = Float.parseFloat(values[9]);
                   if(maxV2<curV2) maxV2=curV2;
                   if(minV2>curV2) minV2=curV2;
                   dailyAveragesV2[day]+=curV2;
                   dailyCountV2[day]++;
               } catch (Exception ignore){}
               try{
                   float curV1 = Float.parseFloat(values[6]);
                   if(maxV1<curV1) maxV1=curV1;
                   if(minV1>curV1) minV1=curV1;
                   dailyAveragesV1[day]+=curV1;
                   dailyCountV1[day]++;

               } catch (Exception ignore){}
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
       System.out.println("v1 "+minV1+" - "+maxV1);//these values are probably erroneous
       System.out.println("v2 "+minV2+" - "+maxV2);

       System.out.println("------------ daily averages");
       for(int i=1;i<dailyAveragesV1.length;i++)
       {
           if(dailyCountV1[i]==0 || dailyCountV2[i]==0) continue;
           System.out.println("day "+i+" v1 "+(dailyAveragesV1[i]/dailyCountV1[i])+" v2 "+(dailyAveragesV2[i]/dailyCountV2[i]));
       }
       System.out.println("total records "+totalRecords+ " time taken: "+((System.currentTimeMillis()-start)/1000)+" seconds");
   }
}


Това мнение е било редактирано от H_A_L_F на 13-11-2018, 01:52
PMEmail Poster
Top
ici
Публикувано на: 13-11-2018, 02:15
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 15768
Регистриран на: 06.06.04



QUOTE (SuN @ 12-11-2018, 23:21)
Да почна първи: ползвам emacs lisp, към момента се боря с парсването на csv все още и е голяма мъка с наивния подход: 6.4гб заета рам като съм напъхал целия файл в буфер (поне така мисля, че прави - трябва да отворя Ц кода) и  съм решил да си конвертирам данните във втори файл за по-голямо удобство като първо създавам списък от колоните... icon_smile.gif

'Ма ти к'во искаш да си почистиш очите със скалпел??? Такава содомия на Ц човек със здрав разум няма да я направи. Това с емакса по-добре го изтрий от мнението. Има разни неща като Матлаб, Питон, Лабвю, еР ...

CODE
import numpy as np
import datetime
import urllib2

def datetime_converter(value):
   dt, tm = value.split("T")
   dt = dt.split("-")
   tm = tm.split(":")
   dt.extend(tm)
   return datetime.datetime(*map(int, dt))

data = np.genfromtxt(
   "http://archive.luftdaten.info/2018-11-11/2018-11-11_sds011_sensor_18257.csv",
   delimiter=';',
   skip_header=1,
   converters = {
       5: datetime_converter
   },
   usecols = (5,6,9)
   )


QUOTE
*** Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32. ***
>>> print data
[(datetime.datetime(2018, 11, 11, 23, 9, 19), 27.17, 6.07)
(datetime.datetime(2018, 11, 11, 23, 11, 46), 37.7 , 7.87)
(datetime.datetime(2018, 11, 11, 23, 14, 14), 39.6 , 8.43)
(datetime.datetime(2018, 11, 11, 23, 16, 42), 28.5 , 5.9 )
(datetime.datetime(2018, 11, 11, 23, 19, 9), 31.4 , 5.67)
(datetime.datetime(2018, 11, 11, 23, 21, 37), 36.03, 5.53)
(datetime.datetime(2018, 11, 11, 23, 24, 5), 31.97, 5.4 )
(datetime.datetime(2018, 11, 11, 23, 26, 32), 28.97, 5.83)
(datetime.datetime(2018, 11, 11, 23, 29), 40.7 , 6.77)
(datetime.datetime(2018, 11, 11, 23, 31, 28), 33.7 , 6.87)
(datetime.datetime(2018, 11, 11, 23, 33, 56), 33.8 , 7.03)
(datetime.datetime(2018, 11, 11, 23, 36, 23), 44.27, 8.37)
(datetime.datetime(2018, 11, 11, 23, 38, 51), 43.87, 9.67)
(datetime.datetime(2018, 11, 11, 23, 41, 19), 46.4 , 8.67)
(datetime.datetime(2018, 11, 11, 23, 43, 46), 34.37, 6.93)
(datetime.datetime(2018, 11, 11, 23, 46, 14), 48.3 , 7.53)
(datetime.datetime(2018, 11, 11, 23, 48, 42), 35.9 , 6.5 )
(datetime.datetime(2018, 11, 11, 23, 51, 9), 37.93, 7.17)
(datetime.datetime(2018, 11, 11, 23, 53, 37), 31.93, 6.57)
(datetime.datetime(2018, 11, 11, 23, 56, 5), 36.77, 6.17)
(datetime.datetime(2018, 11, 11, 23, 58, 32), 32.63, 6.6 )]
>>>






--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
ici
Публикувано на: 13-11-2018, 02:29
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 15768
Регистриран на: 06.06.04



Това даже може да стане още по-забавно:

CODE
import numpy as np, datetime

def datetime_converter(value):
   return datetime.datetime(*map(int, sum(map(lambda x,y: x.split(y), value.split("T"), ["-",":"]),[])))

data = np.genfromtxt(
   "http://archive.luftdaten.info/2018-11-11/2018-11-11_sds011_sensor_18257.csv",
   delimiter=';', skip_header=1, converters = { 5: datetime_converter }, usecols = (5,6,9)
   )


--------------------
Reading undefined locations provides undefined data.
PMEmail PosterUsers Website
Top
Gamma Goblin
Публикувано на: 13-11-2018, 07:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1489
Регистриран на: 21.02.18



QUOTE (sieg @ 13-11-2018, 00:04)
QUOTE (purjola @ 12-11-2018, 23:56)
Период, смятан в минути, дава достатъчно висока точност с малко сметки. Иначе сензора може да дава данни всяка СЕКУНДА ... Направи си сметка за отчитане на максимума от средно 40µg за период една година колко данни ще трябва реално да парсваш. Тук са само 6 гигабайта ...

Ти си напушен, няма друго обяснение.

Има, има, :Д


--------------------
Напред! Живота е сраженье! Напред! И прав всегда ходи!
Напред, макар към поражение! Ако ще паднеш, прав падни!
---
Raw, and untamed in spirit, We chew this world and Spit it out
---
Challenge my own world to chaos
---
“I overcame myself, the sufferer; I carried my own ashes to the mountains; I invented a brighter flame for myself.”
PMEmail PosterUsers Website
Top
sieg
Публикувано на: 13-11-2018, 07:27
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 76
Регистриран на: 22.07.10



QUOTE (stewie @ 13-11-2018, 01:36)
QUOTE (sieg @ 13-11-2018, 01:19)
[CODE]

Колега, File.ReadLines не е ли малко несериозно за големи файлове ? Файлът трябва да се пусне през бач блок, на който му се подава буфер от файла , процесва както си описал (аз не съм гледал структурата, понеже не е важна за заданието) и съответно да трупа я в паметта, я в някой nosql.

Ми то горе-долу така прави, каква точно е ползата дали го четем в голям бач блок или ред по ред?
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 13-11-2018, 07:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1489
Регистриран на: 21.02.18



cpu cache friendliness, което може да доведе до сериозни ускорения, не че за тази задача има значение, и не че блока трябва да е точно 512мб.


--------------------
Напред! Живота е сраженье! Напред! И прав всегда ходи!
Напред, макар към поражение! Ако ще паднеш, прав падни!
---
Raw, and untamed in spirit, We chew this world and Spit it out
---
Challenge my own world to chaos
---
“I overcame myself, the sufferer; I carried my own ashes to the mountains; I invented a brighter flame for myself.”
PMEmail PosterUsers Website
Top
sieg
Публикувано на: 13-11-2018, 08:09
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 76
Регистриран на: 22.07.10



QUOTE (Gamma Goblin @ 13-11-2018, 07:36)
cpu cache friendliness, което може да доведе до сериозни ускорения, не че за тази задача има значение, и не че блока трябва да е точно 512мб.

За какъв точно cpu cache friendliness говорим, когато става дума за стотици мегабайти буфер в паметта и всеки ред се чете точно веднъж?
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 13-11-2018, 08:24
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1489
Регистриран на: 21.02.18



процесора чете от рамта на блокчета с размера на кеш линията която за съвременните процесори е около 64байта.CPUto докато обработва дадени данни в бекграунда ще зареди следващите без да кара  поточната линия да чака.

Обаче ако заредиш 1 ред, после навикаш разни функции дето правят ИО не само че губиш време в context switches, но и губиш времевата и пространствена локалност на данните. Вместо да заредиш следващите данни, ти зареждаш огромно количество код което да направи ИОто, после го изхвърляш за да заредиш един ред и нов код който да го обработи,изхвърляш го и после пак зареждаш огромното количество код и т.н. Супер неефективно е.

https://medium.com/software-design/why-soft...es-8da04355bb8a


--------------------
Напред! Живота е сраженье! Напред! И прав всегда ходи!
Напред, макар към поражение! Ако ще паднеш, прав падни!
---
Raw, and untamed in spirit, We chew this world and Spit it out
---
Challenge my own world to chaos
---
“I overcame myself, the sufferer; I carried my own ashes to the mountains; I invented a brighter flame for myself.”
PMEmail PosterUsers Website
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (19) 1 2 [3] 4 5 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0