Kezdőoldal » Számítástechnika » Programozás » Pascal: fájlokból rekordokba...

Pascal: fájlokból rekordokba történő beolvasási probléma? (bővebben lent)

Figyelt kérdés

Van egy adatbázis, amelyben az adatok egyszerűen, "," karakterrel elválasztva szerepelnek. Ezeket szeretném beolvasni rekordokba.

A program bizonyos fájlnál kiakad, tapasztalataim szerint az 5. fájlnál. Nem tudom, ez memória hiba -e, vagy másnak köszönhető.

Ez az adatbázis konkrétan a GTFS adatbázis, amely a BKK menetrendet tartalmazza.

Mondjuk nem csodálom, ha kiakad, mert az összes fájl mérete 322 MB körül van, igaz gépben 3 GB van, de nem tudom miként kezeli a memóriát a program.

Mit lehetne tenni, hogy a memóriában elférjen, "packed record"-ot használni vagy egyebet?

Aki tud más programozási nyelven megírt kódot, ami jól lekezeli, az érdekelne.

Python-t találtam, de az egyenlőre számomra még túl bonyolult, szerteágazónak tűnik mert nem értek hozzá. :-(

Egyenlőre Pascal-ban szeretném megoldani, ha ez lehetséges.

Az általam írt program hivatkozása:

pastebin(pont)com/bgtsp98N

A GTFS adatbázis:

[link]

A program relatív útvonalon keresi a fájlokat, tehát zip fájl kicsomagolása után a fájlok mellé másolva aktuális könyvtárban nyitja meg őket.

A fájl első sorát azért nem teszem be sehova, mert a fájlok első sora mindig a fejléc, arra pedig nincs szükségem, mert azért hoztam létre a rekordokat.

Olvas függvényben a "pos" eljárással elegánsabb lett volna léptetni és abban sem vagyok biztos, ha üres egy mező (",,") azt jól kezeli -e, bár ekkor elvileg a hossza 1 és nem tartalmaz karaktert...

Mit csináltam rosszul?



2018. dec. 5. 18:10
1 2 3
 11/28 anonim ***** válasza:

Bocsi ez a if index>50 then

break; csak debugolás miatt raktam bele, fáradok már. Ezt ki kellett volna szednem.

2018. dec. 7. 01:59
Hasznos számodra ez a válasz?
 12/28 SimkoL ***** válasza:

'Azért az több mint felháborító, hogy nincs egy split se, csak ilyen saját magad összerakott kínlódásokat találtam, ezt én kínlódtam össze saját kútfőből. Ha van és én voltam béna esetleg mert nem találtam, akkor is jól el van dugva.'

Van Split csak nem úgy hívják :)

2018. dec. 7. 10:39
Hasznos számodra ez a válasz?
 13/28 tabaki ***** válasza:

@#5: „Illetve persze lehet beolvasni egyben is az egész fájlt és úgy dolgozni rajta, vagy karakterenként.”

Természetesen eszem ágában sem volt ezek egyike sem, arra gondoltam, hogy hátha be lehet olvasni valahogy eleve vesszőtől-vesszőig, de a fájl ismeretében kétségtelen, hogy halva született gondolat volt. A darabolásra viszont praktikusabbnak tűnik a Free Pascal beépített függvényét használni. A következő kísérletem miatt előre is esedezem az avatott kollégák bocsánatáért. Mivel nem tudom, mire szolgál az egész program, csak annyit próbáltam változtatni rajta, hogy a fenti módon olvassa be az adatokat. Kivált illetlenség volt nem foglalkoznom a #10 hozzászólással, de az nagyobbrészt olyan problémákat feszeget, amelyekhez az én gyatra imereteim elégtelenek. Két dolog mindenesetre eszembe jutott ezzel kapcsolatban. Az egyik: Lehet, hogy a {$h+} longstring-direktíva sincs igazán üdvös hatással a stringek szerkezetére, de anélkül végképp elvisehetetlenül lassan működik a program, másfél óra múltán le is lőttem inkább. A másik: Nem tudom, hogy jár-e helytakarékossággal, ha a stringek hosszát előre megadjuk, így:

kutyafule : string[5];

...mert ha igen, efféle méretkorlátozásra nagyon sok helyen lehetőség volna.

Az meg nekem is furcsa, hogy minek kell egy feltupírozatlanul is 300 mega körüli adatkazlat teljes egészében a memóriába olvasni, de hát nem ismerem az elgondolás lényegét. A próbálkozásommal kapcsolatban annyi pozitívumról tudok beszámolni, hogy kétszer legalábbis hibajelzés nélkül végigfutott. Hogy közben mit művelt, mit nem, azt egyelőre nem teszteltem. Itt van:

[link]

2018. dec. 8. 01:14
Hasznos számodra ez a válasz?
 14/28 anonim ***** válasza:

"A memória használattal kapocsolatba számolj úgy hogy pascalba alsó hangon ha nincs még plusz overhead akkor egy sima mezei string 256 bájtot foglal. A 0.-ik indexen 1 bájtos hosszúságot jelző érték van, utána a string karaktererei max 255 darab, ha nincs annyi akkor a fennmaradó rész kihasználatlan. A delphi-s féle dinamikus string máshogy fest (nálam nem ez lépett életbe a ObjFPC diretktíva ellenére se)."


10: Dehogy. A pascalban a stringek memóriafoglalása erősen implementáció függő, de a freepascal-ra hagyatkozva, abban legalábbis egészen biztosan optimális, ami annyit tesz, hogy a szükséges memóriaméretet foglalja le csak, annál egy bytettal sem többet.

A short string (string[length]) meg végképp nem memóriafaló, mivel az a string tényleges hosszát foglalja, plusz egy karaktert ami a hosszat jelzi, valóban a nulladik indexen.


"de pluszba hozzátesz hogy vannak karakterek melyek több bájtosok "


Hát ilyenek nincsenek, hacsak nem a UNICODE stringekre gondoltál, mivel azok 2 byte/char hosszúak, de hát, ezért állnak UNICODE karakterből. Ez nem pascal specialitás, másutt is ez az ábra, a unicode karakterek két byte-osak.


A split és egyebekkel kapcsolatban. Azért, mert te nem használod a pascalt, a nyelv még igenis fejlődik. Alapban nem csak split függvény van benne, de még egy rakat string kezelő függvény is, hogy a komplett, "beépített", jól paraméterezhető parserről említést se tegyek.

Szóval a C ajánlgatása, éppen string-manipulációs célra nem volt túl jó ötlet a pascallal szemben, mivel köztudott, hogy ha valaminek, hát éppen a C-nek nincs semmiféle string-kezelő függvénye, szemben a pascallal, amely más ősidők óta tartalmaz efféléket, nem is unit, hanem mindjárt natív nyelvi szinten (persze ez implementáció függő).

2018. dec. 8. 04:32
Hasznos számodra ez a válasz?
 15/28 anonim ***** válasza:

Program Splitter;

{$mode delphi}

uses sysutils;


var

   StrIn : string = ' Hello bakker, , 145.79, , az erő legyen veled';

   StrOut: string;

begin

  writeln(StrIn);

  writeln(' - - - - - - - ');

   for StrOut in StrIn.split(',') do writeln(StrOut);

  readln;

end.

2018. dec. 8. 05:15
Hasznos számodra ez a válasz?
 16/28 A kérdező kommentje:

Nagyon köszönöm mindenki hasznos válaszát, ez a rendkívül egyszerű split nagyon jó, ami kommentem előtt olvasható.

Nagyon köszönöm annak is, aki megírta Pascal-ban a split-et, ráadásul Python-ban is megírta.

2018. dec. 8. 15:55
 17/28 A kérdező kommentje:

Nálam nem akar lefordulni a program, melyet utolsó válaszadó írt, a hiba:

Error: Illegal qualifier

Error: Cannot find an enumerator for the type "<erroneous type>"

2018. dec. 8. 16:00
 18/28 anonim ***** válasza:

Free Pascal Compiler version 3.0.4 [2017/12/03] for i386

Copyright (c) 1993-2017 by Florian Klaempfl and others

Target OS: Win32 for i386

Compiling splitter.pas

Linking splitter.exe

15 lines compiled, 0.1 sec, 67552 bytes code, 4164 bytes data

2018. dec. 8. 22:14
Hasznos számodra ez a válasz?
 19/28 anonim ***** válasza:
{$mode delphi}
2018. dec. 8. 22:16
Hasznos számodra ez a válasz?
 20/28 tabaki ***** válasza:

@#19:

Gondolom, Kérdező a direktívával együtt másolta be az egészet, inkább a verzió nem stimmelhet. Az egyik gépemen 2.6.4-es régi fordító van, az pontosan a fentebbi hibaüzenetet eredményezi, a másikon nálam is 3.0.4, az meg probléma nélkül lefordítja.

2018. dec. 8. 23:32
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!