Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?

[es] :: C/C++ programiranje :: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?

Strane: < .. 1 2 3

[ Pregleda: 3867 | Odgovora: 52 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 18:03 - pre 43 meseci
Citat:
mikikg:
Posto ne mogu to procesiranje paketa da menjam/testiram bez senzora, hajde onda makar da izmestim problem na drugo mesto, tj da smislim nesto sto ce sigurno da mi zavrsi posao za snimanje semplova kada odem na teren kod masine.

Taj senzor ima u sebi TCP server i dozvoljava vise klient konekcija.
Jednom kada mu se posalje komanda za startovanje on posle sam izbacuje pakete, dakle odatle nadalje je sve u jednom smeru, svakih 40ms pljune jedan paket.

Predlozite mi neko *nix resenje/komandu koja se okaci na taj soket i sve sto primi da snima u jedan fajl? Posle cu ja taj fajl da obradujem i vadim pakete ...



Pošto moraš da znaš protokol ne vidim problem da implementiraš server koji će da glumi senzor... please

edit:
ovo please je sam ubacio telefon ;)
 
Odgovor na temu

Dexic
ASP

Član broj: 253999
Poruke: 3837



+1376 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 20:49 - pre 43 meseci
Da tebi ne fali "b" za binary mode?
Jer ovako ti fwrite procesira input buffer kao da je tekst.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 21:19 - pre 43 meseci
Koristi Linux, nema tu binary mode.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 21:27 - pre 43 meseci
Citat:
Branimir Maksimovic:
Citat:
mikikg:
Posto ne mogu to procesiranje paketa da menjam/testiram bez senzora, hajde onda makar da izmestim problem na drugo mesto, tj da smislim nesto sto ce sigurno da mi zavrsi posao za snimanje semplova kada odem na teren kod masine.

Taj senzor ima u sebi TCP server i dozvoljava vise klient konekcija.
Jednom kada mu se posalje komanda za startovanje on posle sam izbacuje pakete, dakle odatle nadalje je sve u jednom smeru, svakih 40ms pljune jedan paket.

Predlozite mi neko *nix resenje/komandu koja se okaci na taj soket i sve sto primi da snima u jedan fajl? Posle cu ja taj fajl da obradujem i vadim pakete ...



Pošto moraš da znaš protokol ne vidim problem da implementiraš server koji će da glumi senzor... please

edit:
ovo please je sam ubacio telefon ;)


Heh, pa ne moram bas toliko detaljno da poznajem protokol, nije jednostavan ima tu dosta stvari:
https://www.sick.com/media/pdf/7/27/927/IM0045927.PDF

A i kada bi napravio protokol opet imam problem sa fundamntalnim stvarima koje se ticu tog senzora a to su izmerene vrednosti tacaka, kojim trikovima da simuliram na primer ovakav rezultat, "fleka od tacaka" koja menja oblik i seta se po ekranu, + jitter + false-detection + + + ...
Ovo je kao jedan objekat koji pratim, tek trebam da se bakcem sa algoritmima koji nekako/nesto prepoznaju u toj gomili tacaka ... Zato mi treba snimak, ne mogu to da simuliram ...


Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
Prikačeni fajlovi
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 21:36 - pre 43 meseci
Ma sadrzaj paketa je totalno nebitan. bitno da izsimuliras slanje tih paketa na 40ms. Mogu biti potpuno prazni. Cilj je da popravis onaj read tj prepoznas 0x2 kao pocetak 0x3 kao kraj i odvojis paket, mozes onako kako sam rekao.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 22:01 - pre 43 meseci
Razumem sta pricas, ja tu imam vise problema, ja sam po default u problemu jer vidi sta mi stize od podataka, to mi je najveca zaludjica tu celoj prici, "hteo sam samo" da snimim seplove i lupio glavom o zid iz taka kada sam probao to tamo da uradim u delu code-a koji obraduje prijem sa soketa, necu to da diram vise, prebacicu se ko covek lepo na drugi soket kanal i asinhrono da hvatam to, ne smem da pipam klasu za to procesiranje, samo mogu da je menjam pod striktno kontrolisanim uslovima i da se testira.
U tom parcetu mi je i neka bitna logika za konverziju sfernih u planarne koordinate, pa hvata neke minimume/maksimume po grupama, kritican mi je taj code, to ce na kraju da bude najverovatnije uvezano ili pripremljeno za ML/AI.
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 22:03 - pre 43 meseci
Pazi kod je neispravan, to ce praviti probleme dalje ako to ne resis. Cela fora je da paket mora da bude iz jednog "dela" (tcp ima maks duzinu, mislim na jedan poziv read) primljen da bi radilo, a tcp to ne garantuje.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 22:30 - pre 43 meseci
Citat:
Branimir Maksimovic:
Znas kako ovaj kod nije bas industry strength, tj imas posla sa soketima a ne proveravas da li iskace greska na bogus input
i uopste svaki od tih read/write callova ka soketima moze beskonacno da blokira.
recimo ovo:
Code:

tok = strtok(NULL, " "); //NumberChannels8Bit
    int NumberChannels8Bit;
    sscanf(tok, "%d", &NumberChannels8Bit);
    if (debug)
        printf("NumberChannels8Bit : %d\n", NumberChannels8Bit);
    for (int i = 0; i < NumberChannels8Bit; i++) {

Ne sme nikako da prodje bez provere, jer moze da zaglavi.


Socket select su stavili da bi mogli da setuju timeout, tu je 50ms, cudna vrednost ali to radi, to je kontinualni sistem i jednostavno mora da tera dalje sta god da mu se desi.

Code:

        tv.tv_sec = 0;
        tv.tv_usec = 50000;
        retval = select(sockDesc + 1, &rfds, NULL, NULL, &tv);


Sto se tice bogus inputa i 0x2 0x3, to si u pravu, provericu to ...
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?24.09.2020. u 23:06 - pre 43 meseci
Ehhh ... :)


Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
Prikačeni fajlovi
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?25.09.2020. u 01:44 - pre 43 meseci
Samo jos onaj tab "EMULATORS" da proradi i pobedili su :D
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?03.10.2020. u 01:18 - pre 43 meseci
Citat:
mikikg:
Citat:
Branimir Maksimovic:
Znas kako ovaj kod nije bas industry strength, tj imas posla sa soketima a ne proveravas da li iskace greska na bogus input
i uopste svaki od tih read/write callova ka soketima moze beskonacno da blokira.
recimo ovo:
Code:

tok = strtok(NULL, " "); //NumberChannels8Bit
    int NumberChannels8Bit;
    sscanf(tok, "%d", &NumberChannels8Bit);
    if (debug)
        printf("NumberChannels8Bit : %d\n", NumberChannels8Bit);
    for (int i = 0; i < NumberChannels8Bit; i++) {

Ne sme nikako da prodje bez provere, jer moze da zaglavi.


Socket select su stavili da bi mogli da setuju timeout, tu je 50ms, cudna vrednost ali to radi, to je kontinualni sistem i jednostavno mora da tera dalje sta god da mu se desi.

Code:

        tv.tv_sec = 0;
        tv.tv_usec = 50000;
        retval = select(sockDesc + 1, &rfds, NULL, NULL, &tv);


Sto se tice bogus inputa i 0x2 0x3, to si u pravu, provericu to ...


Kakvu svrhu ima timeout kad je petlja? Pazi ulece u beskonacnu petlju na kraju.... to da li ce zauzimati cpu 100% u toj petlji nema nikakve veze.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
p2-115.p59.bvcom.net.



+1064 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?03.10.2020. u 01:26 - pre 43 meseci
Elem da se vratimo na kod:
Code:

o {
        FD_ZERO(&rfds);
        FD_SET(sockDesc, &rfds);

        tv.tv_sec = 0;
        tv.tv_usec = 50000;
        retval = select(sockDesc + 1, &rfds, NULL, NULL, &tv);
        if (retval) {
            len += read(sockDesc, buf + len, 20000 - len);
        }
    } while ((buf[0] != 0x02) || (buf[len - 1] != 0x03));


Dakle, ovo je petlja. Tu select nema nikakvu svrhu. select ima svrhu samo onda kada osim citanja radis jos nesto dok cekas na input. Dakle ovde select moze da se izbaci.
Drugo da ti ne bih komplikovao da obrazlozim sta je ovde propust.
Pitanje buf[0] != 0x2. To. Dakle ako je buf[0] == 2 izlazi iz petlje i tu nastaje karambol. Zato sto nema garancije da je paket ceo procitan. Ako izbacis
to pitanje i ostavis samo buf[len-1] != 0x3 nece upadati u mrtvu petlju zato sto pretpostavimo da svaki kraj paketa zavrsava sa 0x3. Nema garancije
da neces procitati vise paketa, ali bar nece da uleti u mrtvu petlju.
E sad evo kako sam ja (netestirano) odradio, pa vidi, probaj, ne skodi ;)

Code:

~/.../bmaxa_data/examples >>> cat fwc.c                                                                                                                                                              
/* umesto ovoga
do {
        FD_ZERO(&rfds);
        FD_SET(sockDesc, &rfds);

        tv.tv_sec = 0;
        tv.tv_usec = 50000;
        retval = select(sockDesc + 1, &rfds, NULL, NULL, &tv);
        if (retval) {
            len += read(sockDesc, buf + len, 20000 - len);
        }
    } while ((buf[0] != 0x02) || (buf[len - 1] != 0x03));
*/
// stavi ovo
std::string buf;
bool start=false;
char c=0;
while (true){
    int rc = read(sockDesc,&c,1);
    if (rc!=1){ // error process }
    if (c == 0x2){
        start = true;
        buf.clear();
        continue;
    }
    if (c == 0x3){ break; }
    if (start) buf += c;
}
// len is buf.size()

Dakle citas karakter po karakter sve dok ne naletis na 0x3. Ono sto je interesantno je da hvatas pocetak, tj 0x2 znaci skipujes
ako si promasio pocetak.
string sam uzeo jer je tako jednostavnije nego sam da upucavas u neki bafer i bavis se time.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?16.11.2020. u 11:21 - pre 41 meseci
Mali update na temu, posto sam na srecu lepo organizovao memoriju i sve ovo sto se gore radi se smesta u moju /dev/shm, celu stvar oko snimanja a i tamo neke druge komunikacije sam resio preko NGINX :)

Konkretno nisam dirao ovaj code koji se bavi skumpljanjem podataka, tek cu time da se bavim nakanadno ali sam celu stvar externe I/O komunikacije resio sa jednom C skriptom (NGINX modul) koja pravi most izmedju moje SHM i HTTP (nema nikakav file I/O, sve iz memorije) i to radi mnogo lepo i to moram da napomenem na ARM RPi 2 koji gura i GUI pored svega, NGINX to servira u pozadini bez problema i moze da servira do punih 100Mbit/s na jednom RPi za zauzecem jednog core-a oko 50-55%, sjajno radi.
NGINX radi tako da koliki je PING u mrezi toliko mu treba vremena da vrati odgovor :)

Za klienta sa druge strane konekcije sam iskoristio libCurl koji se pokazao isto odlicno tako da sam na kraju mogao da izvucem cak 450req/s sa paketima od 20kB sto meni ihaaahaaa kako zavrsava posao jer mi je trebalo 25req/s :)
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?

Strane: < .. 1 2 3

[ Pregleda: 3867 | Odgovora: 52 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.