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

Brisanje odredjenih elemenata iz fajla

[es] :: C/C++ programiranje :: Brisanje odredjenih elemenata iz fajla

[ Pregleda: 3788 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aster

Član broj: 1565
Poruke: 197
195.252.80.*



Profil

icon Brisanje odredjenih elemenata iz fajla18.02.2004. u 05:03 - pre 230 meseci
Postoji fajl koji npr. treba "update-ovati", tako da iz treba fajla izbrisati broj ili string u njemu, koji se ne nalazi na kraju fajla, vec negde u sredini. Znaci fajl izgleda ovako:
Code:

209
210
211
212
213
odnosno
Code:

string1
string2
string3
string4
string5

i treba izbrisati broj 211 odnosno string "string3". Interesuje me kako ovo efikasnije uraditi, jer sam trenutno pronasao dva nacina kako ovo uraditi, ali ni jedan nije efikasan.
Prvi je da se ceo fajl kopira u drugi fajl, iskljucujuci broj odnosno string, koji treba izbrisati, onda opet kopirati taj sadrzaj natrag u stari fajl (ili izbristi stari fajl a preimenovati taj drugi).
Na drugi nacin, bi se kopirala samo druga polovina fajla (od broja tj. stringa koji treba izbrisati) i onda opet kopirati taj deo u stari fajl, pri cemu bi prvi broj ili string, u tom drugom delu, dolazio na mesto broja odnosno stringa, i na taj nacin ga obrisao.
Ocigledno je da su oba nacina krajnje neefikasna. Pogotovu u radu sa velikim fajlovima. Stoga me interesuje kako se ovo efikasnije radi?
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 05:37 - pre 230 meseci
Nazalost, ne postoji bitno bolji nacin od ta dva koje si opisao (malo mi ovaj drugi nije jasan, ali nije bitno) - zato se i ne koriste txt fajlovi za skladistenje podataka, vec baze.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 08:55 - pre 230 meseci
Kao sto Relja rece sekvencijalne datoteke i nisu bas neko dobro resenje. Ono sto je sa druge strane moguce je da ako znas 100% da duzina svake linije tog tekst-fajla nece prelaziti cifru N, onda mozes da pazljivo izkodiras da zaista svaka linija fajla bude FIKSNE duzine (pomocu spejsova na kraju linije dodjes do fiksne duzine linije). Kad je svaka linija fiksne duzine, onda fajl mozes otvoriti u BINARNOM modu, otici TACNO na odredjenu "adresu", izmeniti liniju i to je to. To je munjevito brzo (ako znas adresu u startu). Da bi znao tacno adresu mozes da napises takodje i maleni indekser (index-i zapravo sluze da se brzo nadju adrese (lokacije) pojedinih podataka u nekom fajlu. No, kad imas takav fajl, koji otvaras binarno, i index datoteku... onda vec imas i BAZU koju si sam uradio! :) Ovo je veoma lako uraditi - covek koji poznaje fundamentalne strukture podataka i algoritme (merge sort je posebno interesantan kad su ogromni fajlovi u pitanju) ovo moze uraditi za par sati laganog programiranja.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.verat.net

Sajt: localhost


+4 Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 13:33 - pre 230 meseci
postoji jedna caka, a to je da svaki record u fajlu ima boolean flag koji označava da li je record obrisan ili ne (naravno, default false). kada želiš da obrišeš neki record, to je operacija prepisivanja samo jednog bajta.

i naravno, pri sledećem pretraživanju (čitanju) fajla, ignorišeš sve one koji imaju ovaj flag setovan.

/* stara tehnika koja se koristi(la) u file-based "bazama podataka" (DBF i slično), a vrlo je verovatno da se neka unapređena varijanta koristi i danas u RDBMS serverima. */
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
195.252.80.*



Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 16:11 - pre 230 meseci
Citat:
Reljam:
Nazalost, ne postoji bitno bolji nacin od ta dva koje si opisao (malo mi ovaj drugi nije jasan, ali nije bitno) - zato se i ne koriste txt fajlovi za skladistenje podataka, vec baze.

Drugi nacin bi bio da se ne kopira ceo fajl, vec ako fajl izlgeda ovako:
Code:

501
502
503
504
505
i potrebno je izbaciti broj 503, onda bi se kopirao "drugi" deo koji sadrzi brojeve 504, 505, u privremeni fajl (ili memorijksi bufer), i onda se kopirao natrag u stari fajl preko clana koji treba izbrisati, i oznaci se da nakon kopiraja tog drugog dela, odsece ostatak fajla, nakon cega bi fajl izgledao ovako:
Code:

501
502
504
505

Kazes da su onda baze resenja, ali zar i baze ne bi morale da se oslanjaju na ove nacine? Ili mozda rade po nekom drugom metodu, koji bi opet verovatno mogao da se implementira u c/c++. Ne poznajem baze dovoljno, zbog toga pitam.
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
195.252.80.*



Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 16:12 - pre 230 meseci
Citat:
leka:
Kao sto Relja rece sekvencijalne datoteke i nisu bas neko dobro resenje. Ono sto je sa druge strane moguce je da ako znas 100% da duzina svake linije tog tekst-fajla nece prelaziti cifru N, onda mozes da pazljivo izkodiras da zaista svaka linija fajla bude FIKSNE duzine (pomocu spejsova na kraju linije dodjes do fiksne duzine linije). Kad je svaka linija fiksne duzine, onda fajl mozes otvoriti u BINARNOM modu, otici TACNO na odredjenu "adresu", izmeniti liniju i to je to.

Mozes li malo da mi ovo pojasnis. Naime, ovo je ok, svi su fiksne velicine, i to je lako i brzo ako treba zameniti neki element. Odnosno, ako znam da neki element, koji treba izmeniti, se nalazi na npr. 50 bajta od pocetka fajla i da je taj element dugacak 10 bajta, onda mogu da odem na pocetak (fseek 50 bajta) i "padujem" nulama (ili necim drugim) pa unesem preko njega drugi element (ili unesem preko njega drugi element, i onda padujem nulama, u zavisnosti od toga kako element treba da izgleda), i element je izmenjen.
Medjutim kako u ovom slucaju obrisati a ne menjati, element. Odem na pocetak elemnta, i sta onda? :) Zar se opet ne svodi na kopiranje u drugi fajl? Mogao bih mozda da preko celog tog elementa upisem nule, ali i dalje se zauzima prostor u fajlu.
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
195.252.80.*



Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 16:14 - pre 230 meseci
Citat:
-zombie-:
postoji jedna caka, a to je da svaki record u fajlu ima boolean flag koji označava da li je record obrisan ili ne (naravno, default false). kada želiš da obrišeš neki record, to je operacija prepisivanja samo jednog bajta.

i naravno, pri sledećem pretraživanju (čitanju) fajla, ignorišeš sve one koji imaju ovaj flag setovan.

Ovo je u redu ako je potrebno samo ignorisati "izbrisne" elemente, ali oni su i dalje tu, i zauzimaju memoriju. Na primer, prosecna velicina elemnta je 10 bajta, i bilo je 100 recorda koji su izbaceni na taj nacin (svakom od njih je setovan boolean flag) i to je ok jer su oni ignorisani, ali oni su i dalje u fajlu i zauzimaju 1000 bajta. Jedino da se nastavi sa ovakvim radom i onda, nakon nekog vremenskog perioda, updateovati celo fajl, na gore opisane nacine (kopiranje fajla, napred-nazad).
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Brisanje odredjenih elemenata iz fajla18.02.2004. u 16:36 - pre 230 meseci
Citat:
aster:
Kazes da su onda baze resenja, ali zar i baze ne bi morale da se oslanjaju na ove nacine? Ili mozda rade po nekom drugom metodu, koji bi opet verovatno mogao da se implementira u c/c++. Ne poznajem baze dovoljno, zbog toga pitam.


Baze koriste ovako nešto:

http://www.bluerwhite.org/btree/
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Brisanje odredjenih elemenata iz fajla19.02.2004. u 09:57 - pre 230 meseci
Moderne baze koriste B+ stabla ILI malo specificne HASH tabele.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.beg.sezampro.yu



Profil

icon Re: Brisanje odredjenih elemenata iz fajla19.02.2004. u 13:38 - pre 230 meseci
Leko zamolio bih te da mi odgovoris na ovo (citat ispod), interesuje me na koje si resenje mislio, jer opet, elementi fiksne duzine u fajlu bi mozda i bili prihvatljivi. Samo mi nije potpuno jasno, kako si mislio da se obrisu ti elementi.

Hvala.
Citat:
aster:
Citat:
leka:
Kao sto Relja rece sekvencijalne datoteke i nisu bas neko dobro resenje. Ono sto je sa druge strane moguce je da ako znas 100% da duzina svake linije tog tekst-fajla nece prelaziti cifru N, onda mozes da pazljivo izkodiras da zaista svaka linija fajla bude FIKSNE duzine (pomocu spejsova na kraju linije dodjes do fiksne duzine linije). Kad je svaka linija fiksne duzine, onda fajl mozes otvoriti u BINARNOM modu, otici TACNO na odredjenu "adresu", izmeniti liniju i to je to.

Mozes li malo da mi ovo pojasnis. Naime, ovo je ok, svi su fiksne velicine, i to je lako i brzo ako treba zameniti neki element. Odnosno, ako znam da neki element, koji treba izmeniti, se nalazi na npr. 50 bajta od pocetka fajla i da je taj element dugacak 10 bajta, onda mogu da odem na pocetak (fseek 50 bajta) i "padujem" nulama (ili necim drugim) pa unesem preko njega drugi element (ili unesem preko njega drugi element, i onda padujem nulama, u zavisnosti od toga kako element treba da izgleda), i element je izmenjen.
Medjutim kako u ovom slucaju obrisati a ne menjati, element. Odem na pocetak elemnta, i sta onda? :) Zar se opet ne svodi na kopiranje u drugi fajl? Mogao bih mozda da preko celog tog elementa upisem nule, ali i dalje se zauzima prostor u fajlu.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Brisanje odredjenih elemenata iz fajla19.02.2004. u 16:56 - pre 230 meseci
Pa kao sto sam rekao u tom tekstu, s obzirom da su sve linije fiksne
duzine, dakle N+1 (ili N+2 na Windows-u) bajta, onda mozes datoteku da
otvoris BINARNO, i da skaces sa adrese na adresu kako ti volja, zato jer
je svaki record (linija na adresi koja je deljiva sa brojem bajtova u
liniji (N+1 na UNIX-u).

Evo primera takvog fajla:


NAPOMENA: '@' u primeru je LF (oznacava kraj linije), dakle rec je o
tekstualnom fajlu na UNIX-u. Evo primera istog fajla na Windows-u:

Ovde '@$' znaci predstavljaju CRLF tj "rn", dva bajta koja na
Windows-u predstavljaju oznaku za kraj linije.
Takodje treba napomenuti da NN: predstavljaju ADRESU svake linije u
fajlu! Ti podaci SE NE NALAZE U FAJLU! :) Sam fajl kad se "cita" izgleda
naravno ovako:
Code:

pera
milorad
franjo
tomislav


Elem, kada znas tacno na kojoj adresi se nalazi odredjeni podatak, ti
uvek sa lseek() mozes da odes na adresu podatka koji te (ne) interesuje,
i da ga obrises (prosto ga popunis spejsovima recimo - to je
najjednostavnije).

[Ovu poruku je menjao leka dana 19.02.2004. u 19:21 GMT]
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Brisanje odredjenih elemenata iz fajla19.02.2004. u 17:04 - pre 230 meseci
Da bih bio jos vise deskriptivan napravih i hexdump ovakvog fajla:
Code:

          0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
------------------------------------------------------------------------
0000000   p   e   r   a                          \n   m   i   l   o   r
0000010   a   d              \n   f   r   a   n   j   o
0000020  \n   t   o   m   i   s   l   a   v
000002b

PAZNJA: U ovom primeru svaka linija tekst fajla je dugacka 11 bajtova! :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Brisanje odredjenih elemenata iz fajla19.02.2004. u 17:16 - pre 230 meseci
Jos jedna interesantna mogucnost je ova - kada obrises podatak (liniju) tako sto je "prepises" spejsovima (ili nekim drugim karakterom), onda ces bez problema moci sledeci podatak, koji nekad u buducnosti budes zeleo da upises u fajl, da upises na mesto prvog praznog reda na koji budes naisao.

Jos jedna mogucnost bi bila da ti PRVI sadrzi broj prvog reda (ili adresu jos bolje) koji je prazan. Onda kada treba da upises novi podatak samo "skocis" na tu adresu i pises direktno. :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

aster

Član broj: 1565
Poruke: 197
*.beg.sezampro.yu



Profil

icon Re: Brisanje odredjenih elemenata iz fajla21.02.2004. u 02:12 - pre 230 meseci
Da, to u vezi brisanja me je interesovalo. Ali ipak, ovakvim "brisanjem" se ne oslobadja memorija, odnosno ne smanjuje velicina fajla, vec samo brisu podaci. Onda bi ipak moralo s vremena na vreme "updateovati" taj fajl i to na nacin koji sam smatrao neefikasnim (kopiranjem celog fajla u privremeni, vez elemenata koji sadrze samo spejsove). Opet se svodi na to :)
Hvala na odgovorima.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.glfd.dial.virgin.net



+4 Profil

icon Re: Brisanje odredjenih elemenata iz fajla21.02.2004. u 03:00 - pre 230 meseci
Ako se dobro sećam, pre nekih 10-ak godina je u Računarima (RIP!) bila serija članaka koja je baš ovu problematiku opisivala - tj. File-system u fajlu i završila sa prilično zgodnom "emulacijom" baze u okviru jednog fajla...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Brisanje odredjenih elemenata iz fajla

[ Pregleda: 3788 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

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