Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Zasto glavi fwrite() pri 25 zapisa/fajlova u sekundi?
#1
Pozdrav,

imam neko parce code-a koji radi prostu stvar, hvata neke pakete podataka koju su veliki oko 5-6kB, ti paketi mi dolaze brzinom od 25 paketa u sekundi i program treba da hvata te podatke i snima u fajlove za neku dalju analizu.

Medjutim, to ne radi dobro, kako pustim to da radi program uhvati/snimi nekih 120-150 paketa/fajlova i nakon toga zaglavi??

Program treba da radi na RPi ali isti problem imam i kada to poteram na PC pod macOS, skoro se sve isto ponasa.
Na PC definitivno nemam problema sa I/O brzinom, to je i7 masina sa Aorus NVMe diskom, brze ot toga nemam ...

Probao sam da snimam i u RAMDISK (tmpfs) i isto se ponasa?

U cemu je ovde problem, ko/sta ovde pravi taj problem?

Code:
    ...
    char buf[128000];
    ...
    // U buf su popunjeni podaci ...
    // U len imam duzinu paketa, menja se izmedju 5 i 6 kB ...
    ...

    //----------------- save samples -------------
    if (samlpe_count < 1000 ) {
        char fname[80];
        sprintf(fname, "sample_%03d.dat", samlpe_count);
        printf("Writing %s ... \r\n", fname);

        FILE *my_write_fd = fopen(fname, "w+");
        fwrite(buf, len, 1, my_write_fd);
        fclose(my_write_fd);

        samlpe_count++;
    }
Reply
#2
Jesi siguran da glavi fwrite, a ne negde drugde?
Reply
#3
Pa u sustini oko fwrite() je problem, to parce coda mi je vremenski kriticno jer moram u 40ms da obradim paket i sad ovo dodatno da snimim jedan fajl od 5-6KB, problem nastaje kada fwrite() potrosi vise od 35-40ms za snimanje jednog fajla, tada mi se razbuca tajming i tad u sustini i zaglavi.

Ali opet zasto se to desi tek posle 100-ak fajlova, sto ne zaglavi odmah ili posle 5-6 ... mislim nije mi jasno ...
Reply
#4
Cao Miki,
odavno se nisam zezao sa C-om ali mozes li da izbacis ovo iz petlje tj uslova
FILE *my_write_fd = fopen(fname, "w+");
fwrite(buf, len, 1, my_write_fd);
fclose(my_write_fd);

Negde ispred uradi fopen i kada je gotovo fclose
Reply
#5
Testiraj fopen da nije NULL i testiraj rezultat fwrite pa to mozes da guras u poseban fajl ili da ti izbaci gresku kad zabode jedno od ova dva.
Reply
#6
@Milan_kg
Hmm, u sustini moze i tako ali moram onda da otvorim recimo 1000 fajl pointera unapred pa onda da ih prozivam, nisam siguran da ce to pomoci ...

Moracu to totalno drugacije nekako da resim, mislim da preko /dev/shm mozda moze da se to resi, makar cu razdvojiti procese ...
Reply
#7
Miki,
ne treba ti 1000 pointera, otvori negde u main-u jedan a u tom uslovu samo radi write. Kada ispunis uslov uradi close
Reply
#8
Pa da, i dodaj neki delimeter pa posle splituj fajl?
“If you think you are too small to make a difference, try sleeping with a mosquito.” - Dalai Lama XIV
Reply
#9
To sto predlazete je u sustini APPEND na jedan otvoren fajl pointer, stim sto ne mogu da radim sa delimiterima, nema delimitera u binarnim fajlovima (mislim ne moze da se koristi), morao bih da radim sa fiksnom velicinom bloka npr 8KB ka da se kasnije kod citanja baksem sa SEEK() ...

Probacu tako nesto pa da vidim sta se desava ...
Reply
#10
1.
Pokreni program sa
# chrt -f 21 ./program
pa vidi hoce li biti drugacije.

2.
Koristi sistemske open/write/close funkcije umesto ovih standardnih C-ovskih, imaju manje overheda
Reply
#11
Ehh, da sam se pre setio da ima gotov data recorder ...

[Image: attachment.php?aid=34132]


Attached Files Thumbnail(s)

Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)