Προς το περιεχόμενο

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • 0
smilefreeware

delphi7 και μεγάλο const array

Ερώτηση

Επειδή έχω την τρέλα να φτιάχνω προγράμματα αν είναι δυνατόν σε 1 αρχείο exe μου παρουσιάστηκε το εξής.

 

Εβαλα σε 1 unit

CONST

AR: ARRAY [1..277000] OF STRING = ( ....

περίπου 2.700.000 bytes και 14.000 lines

Το compile κόλησε.

 

Το ίδιο το δοκίμασα σε ισχυρότερο μηχάνημα με το CodeGear.RAD.Studio.Delphi.2007 και το κατάφερε αλλά έκανε αρκετή ώρα.

 

Τι είναι αυτό που το πειράζει ?

το συνολικό μέγεθος, το μέγεθος του πίνακα, τα strings μήπως τα αλλάξω σε char κλπ.

Υπάρχει κάτι καλύτερο που μπορώ να κάνω ?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Προτεινόμενες αναρτήσεις

Μπορείς να το βάλεις σαν .res να γίνεται link στο .exe σου. Εφόσον είναι στατικό δεν θα χρειάζεται καν compile παρά μόνο linking.

 

Γράψε λεπτομέρειες για το πώς το χρησιμοποιείς για να σου πω περισσότερα. Π.χ. θες υποχρεωτικά να είναι σε πίνακα; Πώς τα προσπελαύνεις μετά; Θες ταχύτητα, να είναι όλα στη μνήμη ή μπορείς να τα διαβάζεις με μια συνάρτηση που να τα τραβάει από το .exe; Είναι ταξινομημένα; Πόσο συχνά τα αλλάζεις; κτλ κτλ.

 

Μήπως είναι binary δεδομένα και απλά τα μετέτρεψες σε string? Γιατί τότε υπάρχει και πιο εύκολος τρόπος...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Τα αλφαριθμητικά (στρινγκ) έχουν το ίδιο μήκος;

 

Μια ιδέα μου 'ρθε είναι να ορίσεις κάπως έτσι:

 

>
CONST
 AR: ARRAY [1..277000] OF STRING[color="Red"][b][βάλε το μήκος][/b][/color] = ( ....

 

Και κάτι γενικό: τα "string" δεν έχουν ορισμένο μέγεθος (<255). Δεν είναι π.χ. όπως ένα "longword"=4 μπάιτ. Μπορεί αυτό να προκαλεί το πρόβλημα...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Βρέθηκε-βρέθηκε

Thanks.

 

fireworksas5.jpg

 

Το xn resource editor δεν είδα να υποστηρίζει html resources, οπότε (εκτός κι αν έχω χάσει τίποτα νέες εκδόσεις) όσο και να παιδευτείς δεν θα το καταφέρεις!

tmpStream := TResourceStream.Create( HInstance, 'ARXEIO1', 'HTML' )

Δεν είχα πιάσει το 'HTML' τι είναι.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

1) Τα σώζεις σε ένα αρχείο text. Π.χ. με το wordpad.

2) Φτιάχνεις ένα .res αρχείο που στο HTML κομμάτι του (resource-type=23) θα έχει μέσα το .text αρχείο.

Αυτό μπορείς να το κάνεις με ένα σωρό utilities, π.χ. reshacker ή με το (δωρεάν) RC.exe από το Platform SDK της Microsoft.

3) Βάζεις ένα {$R arxeio.res} στο main.dpr σου.

4) Στο initialization section ή στο mainformcreate, καλείς τον παρακάτω κώδικα:

 

>
procedure LoadStringResource2;
var
 tmpStream: TResourceStream;
begin
 tmpStream := TResourceStream.Create( HInstance, 'keimeno', 'HTML' );
 try
   memo1.Lines.LoadFromStream( tmpStream );
 finally
   tmpStream.Free;
 end;
end;

 

Έτοιμο, στο memo1 έχεις όλο το κείμενο.

Φυσικά δεν χρειάζεται να χρησιμοποιήσεις memo, αρκεί ένα οποιοδήποτε TStringList και ας μη φαίνεται στην οθόνη.

 

Compile time = ελάχιστος, χρήση μνήμης = ελάχιστη.

 

Υ.Γ. επίσης δες το DBFPlus ή το DBFNavigator201 για να μην παιδεύεσαι με κώδικα! :)

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Κάτι κατάφερα με συνδυασμό του

reshacker και του

XNResourceEditor http://www.wilsonc.demon.co.uk/d10resourceeditor.htm

 

Πήρα ένα τυχαίο res , το άνοιξα με το XNResourceEditor , έσβησα τα άχρηστα και έκανα add 1 string table και έβαλα 1 string, το έσωσα.

Μετά το άνοιξα με το reshacker το οποίο δίνει edit , οπότε πιθανολογώ αν βάλω εκεί το τεχτ με τα strings θα δουλέψει.

 

--------------------------------------------

Από εδώ το βρήκα

Free Windows Resource Editors, Resource Compilers, Resource Hackers, Icon Editors

http://www.thefreecountry.com/programming/resourceeditors.shtml

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Υπάρχει το ενσωματωμένο TListView γι' αυτήν την δουλειά, δες π.χ. το πρόγραμμα της υπογραφής μου, αν φτιάξεις έναν πίνακα με ένα δισεκατομμύριο θέσεις τον ζωγραφίζει ακαριαία (virtual) ακόμα και σε 486 @50MHz.

 

Απλά του "δίνεις" τα δεδομένα που θέλεις να ζωγραφίσει στο event Data, και για να μην έχει flicker του ενεργοποιείς και το double buffering.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

TListView: αν το κάνεις virtual όπως το λέω, δεν βάζεις κανένα item, οπότε και δεν αργεί καθόλου.

Απλά όταν θέλει να ζωγραφίσει ένα item στο ζητάει μέσα από το data event, δηλαδή το περισσότερο είναι να σου ζητήσει να του δώσεις 20-30 items που χωράνε στην οθόνη. Ε, προφανώς αυτό εκτελείται σε λίγα msec.

 

Έτσι έχεις και οικονομία μνήμης, αφού τα δεδομένα θα τα έχεις μόνο στην TStringList σου, δεν θα τα έχει και το control.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Περιμένω την τελική έκδοση με mail, ε; :P ;) :-D

Σύντομα θα έρθει η beta.:-):-):-)

 

Τελικά άλλαξα το Memo με TStringList και τα items τα ένωσα ανά 5 ώστε τα 270.000 έγιναν 54.000.

Με αυτό τον τρόπο έγινε πολύ γρηγορότερο, σχεδόν ακαριαίο.

Στην αρχή με 270.000 και MEMO έκανε 3-4 sec.

ΜΙλάω για celeron 1.8

 

Αντί TListItems έβαλα TStringGrid + TScrollBar.

Τα items του TStringGrid είναι όσα εμφανίζονται δηλ. 10-30 και ανάλογα με τη κίνηση του Scroll εμφανίζω τα αντίστοιχα items μέσα στο TStringGrid .

Βέβαια θα ελέγξω και το resize της φορμας.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

@Directx Εχεις pm

 

@alkisg Εφυγε το mail

 

Τελικά το qsort με 55.000 items σε 5 κολώνες πατώντας κάποια κολώνα κάνει sort Ascending or Descending σε περίπου 1 sec.

(celeron 1.8)

 

Πείραξα λιγάκι την qsort και έκανε sort ταυτόχρονα σε 2 πίνακες.

Δηλ. έκανε sort ston 1 πίνακα και ότι αλλαγές γίνονταν στον 1 γίνονταν και στον άλλο.

(Ιδέα από την Power Basic με την έκφραση tag array)

 

Από κάποιον Robert Zale που έφτιαξε την Power Basic και προηγουμένως αν ψάξει κανείς και την Turbo BAsic (Το ΕΧΕ) θα βρεί μέσα το

" TURBO BASIC/Copyright © 1987 by Borland International/All Rights Reserved RSZale "

Τον οποίο έχω πληρώσει αρκετά, έχω πάρει σχεδόν όλες τις εκδόσεις του. (και το φχαριστήθηκα).

Αυτά. (Γύρισα λίγο πίσω ...)

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Μήπως είναι binary δεδομένα και απλά τα μετέτρεψες σε string? Γιατί τότε υπάρχει και πιο εύκολος τρόπος...

Οχι είναι extract από μια dbf, απλό κείμενο γράμματα-αριθμοί.

Πάντως με πιάνει περιέργεια για το πιό εύκολος τρόπος, γιατί την ίδια τεχνική έχω χρησιμοποιήσει και για binary (CONST AR:ARRAY[0..30003] OF CHAR = (#77,#90,#0,#1,... )

 

Μπορείς να το βάλεις σαν .res να γίνεται link στο .exe σου. Εφόσον είναι στατικό δεν θα χρειάζεται καν compile παρά μόνο linking.

Αυτό δεν το έχω δοκιμάσει. Αν είναι λίγα γράψτα. (Μου δείχνει για λύση)

 

Γράψε λεπτομέρειες για το πώς το χρησιμοποιείς για να σου πω περισσότερα. Π.χ. θες υποχρεωτικά να είναι σε πίνακα; Πώς τα προσπελαύνεις μετά; Θες ταχύτητα, να είναι όλα στη μνήμη ή μπορείς να τα διαβάζεις με μια συνάρτηση που να τα τραβάει από το .exe; Είναι ταξινομημένα; Πόσο συχνά τα αλλάζεις; κτλ κτλ.

Μια εμφάνιση τύπου excel θέλω να δώσω με sort κλπ. τίποτα το ιδιαίτερο.

Απλώς χρησιμοποιώ δικιά μου ρουτίνα γιατί το TListView είναι αργό για πολλά items.

Είναι περίπου 55.000 items με 5 columns. Για ταχύτητα δεν υπάρχει πρόβλημα γιατί έχω χρησιμοποιήσει περισσότερα χωρίς πρόβλημα. Μόνο στο sort θέλει λίγο παιχνίδι.

 

Αυτό με το "συνάρτηση που να τα τραβάει από το .exe" το αποφεύγω μην έχω πρόβλημα με αντιβιοτικά που χτυπάνε κλπ. Παλιά το έκανα, κόλαγα τα data στο τέλος του exe.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Τα strings τι μέγεθος έχουν; Π.χ. σταθερό 80 χαρακτήρες, μεταβλητό από 1 μέχρι 10.000 χαρακτήρες κτλ.

 

Ρωτάω πολλά γιατί υπάρχουν τεχνικοί περιορισμοί ανάλογα με τη μέθοδο που θα σου προτείνω, υπάρχουν πολλές διαφορετικές.

 

Το linking δεδομένων στο .exe είναι εύκολο, το δύσκολο είναι που τα θες σε array, γι' αυτό και οι ερωτήσεις.

 

Π.χ. το Delphi έχει την resourcestring οδηγία με την οποία ένα string μπαίνει στο .exe. Αν ήθελες απλά πολλά μικρά strings τότε χωρίς εξωτερικά εργαλεία έβαζες όλα τα strings σε ένα unit, το έκανες compile μόνο μία φορά και ξεμπέρδευες. Στην περίπτωσή σου μάλλον αυτό δεν σου κάνει γιατί θες array. Θα μπορούσες να φτιάξεις κι άλλο ένα unit με το array, π.χ.

array[1] := myresourcestring1;

array[2] := myresourcestring2;

κτλ αλλά υπάρχει περιορισμός 4096 bytes για κάθε resourcestring.

 

Μια πολύ καλή εναλλακτική είναι το ανοικτού κώδικα virtual tree view, το οποίο μπορεί να δουλέψει με εκατομμύρια εγγραφές σε ελάχιστο χρόνο. Αντί να χρησιμοποιείς πίνακα χρησιμοποιείς τις ρουτίνες που έχει για streaming και ξεμπερδεύεις.

 

Επίσης τα Windows υποστηρίζουν virtual list boxes (καμία σχέση με το παραπάνω), όπου δεν έχουν δεδομένα, αλλά τα ζητάνε real time από την εφαρμογή όταν θέλουν να τα ζωγραφίσουν στην οθόνη. Έτσι π.χ. μπορείς να έχεις ένα δισεκατομμύριο εγγραφές χωρίς να πιάνουν καθόλου RAM.

 

 

Για τη συνάρτηση που τραβάει από το .exe εννούσα να μπει κανονικά στο .exe σαν resource, όχι να τα κολλήσεις απλά στο τέλος. Δεν υπάρχει πρόβλημα με τα antivirus σου όταν δουλεύεις με resources. Π.χ. στο πρόγραμμα της υπογραφής μου έχω βάλει ολόκληρο δικτυακό χώρο για να ενσωματώσω τη βοήθεια στο εκτελέσιμο.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Μην το βάζεις σαν string table γιατί τότε θα χρειαστείς διαφορετικό κώδικα και δεν θα βολεύει το TStringList. Βάλ'το σαν ολόκληρο text αρχείο.

 

Δες και τα mail σου... ;)

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Τελικά άλλαξα το Memo με TStringList και τα items τα ένωσα ανά 5 ώστε τα 270.000 έγιναν 54.000.

 

Αν έχεις μεγάλες TStringLists μπορεί να δεις και την THashedStringList class για μεγαλύτερη ταχύτητα προσπέλασης των δεδομένων.

 

Μόνο προσοχή, διότι σε C/C++ Builder 6 (δεν ξέρω αν αυτό το πρόβλημα αφορά και την Delphi παρόμοιων εκδόσεων) η THashedStringList παρουσιάζει ορισμένα τεχνικά προβλήματα στο initilization της (VCL bug).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Το xn resource editor δεν είδα να υποστηρίζει html resources, οπότε (εκτός κι αν έχω χάσει τίποτα νέες εκδόσεις) όσο και να παιδευτείς δεν θα το καταφέρεις!

 

Καλύτερα να το κάνεις με το rc.exe από το platform sdk, γίνεται τελείως αυτοματοποιημένα, σαν να κάνεις διπλό κλικ σε batch file.

 

Φτιάχνεις ένα Project.rc με περιεχόμενα σαν αυτό:

>
LANGUAGE 0, 0

ARXEIO1        HTML   "ARXEIO1.TXT"
ARXEIO2        HTML   "ARXEIO2.TXT"

 

και το καλείς έτσι:

>
C:\....\PlatformSDK\RC.Exe /v Project.rc

 

Οπότε φτιάχνεται το Project.res, το οποίο είναι αυτό που κάνεις {$R Project.res}.

 

Το 'keimevo' που έλεγες είναι το όνομα του HTML resource που έβαλες μέσα στο Project.rc, στο παραπάνω παράδειγμα δηλαδή το ARXEIO1 και ARXEIO2.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Αυτό το resourcestring πράγματι είναι λύση, απλώς δεν το ήξερα.

 

Με τράβηξε όμως το res.

Την τρέλλα όμως την ξέρεις, αν δεν το καταφέρω θα σκάσω.

 

Compile το πέτυχα.

Οταν όμως πάταγα κλικ για να τραβήξω από το res

tmpStream := TResourceStream.Create( HInstance, 'keimeno', 'HTML' );

Αυτό το 'keimeno' ότι και αν του έβαζα κτύπαγε.

Δεν μπορώ να βρώ τι όνομα να βάλω.

 

Βρήκα και αυτό http://www.delphidabbler.com/articles.php?article=10

που ενσωματώνει και τρέχει html με res

Στο κάτω μέρος της σελίδας κατεβάζεις demo source.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...