Memo zu klein?
Memo zu klein?
Wenn ich 31.536.000 Werte die je 14 Zeichen haben, abspeichern möchte, ist ein Memo wohl zu klein?!
Gibt es eine alternative?
Viele Dank schon mal!
Gruß Gilli
Gibt es eine alternative?
Viele Dank schon mal!
Gruß Gilli
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Memo zu klein?
AFAIK kann ein Memo (unter Windows?) maximal 65 Kilobyte Daten halten.
Wenn du die Daten nur speichern, aber nicht anzeigen möchtest, verwende TStringList.
Wenn du die Daten auch anzeigen möchtest, schau dir die anderen Komponenten an (TListBox, TStringGrid, etc.)
Wenn du die Daten nur speichern, aber nicht anzeigen möchtest, verwende TStringList.
Wenn du die Daten auch anzeigen möchtest, schau dir die anderen Komponenten an (TListBox, TStringGrid, etc.)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Lazarusforum e. V.
- Beiträge: 7178
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Memo zu klein?
Probiere es einfach mal aus und sonst verwende SynEdit bzw. SynMemo
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Memo zu klein?
AFAIK kann ein Memo (unter Windows?) maximal 65 Kilobyte Daten halten.
Ich habe es gerade mit eine Text-Datei, welche über 1MB, probiert.
Mein Memo unter Windows hat es gefressen.
Wenn ich 31.536.000 Werte die je 14 Zeichen haben, abspeichern möchte, ist ein Memo wohl zu klein?!
Muss es eine Memo sein, wen nein, würde vielleicht eine Array weiterhelfen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Memo zu klein?
Hallo,
mal quick&dirty.
Ein Button, ein höher als breites Memo mit passend vertikaler scrollbar daneben.
Die Daten aus der Stringliste werden nur für den sichtbaren Bereich des Memos kopiert, was sehr schnell geht.
Ob die Zeilenanzahl so richtig berechnet ist, bezweifele ich, ist aber auch nur ein Ansatz.
Die Erstellung von 31 Mio Strings und Anfügen an die Stringsliste dauerte 10 Sekunden, bei 1,25 Gb Speicherbelegung.
Gruß Horst
mal quick&dirty.
Ein Button, ein höher als breites Memo mit passend vertikaler scrollbar daneben.
Die Daten aus der Stringliste werden nur für den sichtbaren Bereich des Memos kopiert, was sehr schnell geht.
Ob die Zeilenanzahl so richtig berechnet ist, bezweifele ich, ist aber auch nur ein Ansatz.
Die Erstellung von 31 Mio Strings und Anfügen an die Stringsliste dauerte 10 Sekunden, bei 1,25 Gb Speicherbelegung.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
ScrollBar1: TScrollBar;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ScrollBar1Change(Sender: TObject);
private
{ private declarations }
FRowCntMemo: integer;
Fsl: TStringList;
procedure AusgabeAb(StartPos: integer);
public
{ public declarations }
end;
const
CAP = 31 * 1000 * 1000;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
T: TDatetime;
i: integer;
begin
try
if not (Assigned(Fsl)) then
begin
FSL := TStringList.Create;
Fsl.Capacity := CAP;
ScrollBar1.Max := CAP - FRowCntMemo;
ScrollBar1.Min := 0;
T := now;
for i := 0 to CAP - 1 do
Fsl.Add(Format('%14d', [i]));
T := now - T;
end;
with memo1 do
begin
Lines.add(Format(' %8.3f Sekunden fuer %d Strings', [T * 86400, CAP]));
Lines.add(Format('Zeilen im Memo %d', [FRowCntMemo]));
while Lines.Count < FRowCntMemo do
Lines.add(' ');
end;
finally
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var
i: integer;
begin
with Memo1 do
begin
i := Height div (-Font.Height + 4) - 2;
// Height := (-Font.Height+4)*(i+2);
FRowCntMemo := i;
Lines.Capacity := FRowCntMemo;
Clear;
Lines.Add(Format('Memo Height %d', [Height]));
Lines.Add(Format('Font Height %d', [-Font.Height + 1]));
end;
end;
procedure TForm1.AusgabeAb(StartPos: integer);
var
I: integer;
begin
for i := 0 to FRowCntMemo - 1 do
Memo1.Lines[i] := Fsl[i + Startpos];
Memo1.Update;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
AusgabeAb(ScrollBar1.Position);
end;
end.
Gruß Horst
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Memo zu klein?
Was hast du mit so einer grossen Stringlist vor ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 957
- Registriert: Mo 11. Sep 2006, 22:56
Re: Memo zu klein?
gillian_x hat geschrieben:Wenn ich 31.536.000 Werte die je 14 Zeichen haben, abspeichern möchte, ist ein Memo wohl zu klein?!
Gibt es eine alternative?
Viele Dank schon mal!
Gruß Gilli
Sorry, ich hoffe ich hab dich falsch verstanden, aber wenn du für die Vorhaltung und nicht für die Darstellung der Daten, ein Memo verwendest machst du grundsätzlich etwas falsch.
Re: Memo zu klein?
Hi!
Danke für eure Hilfe!
Ich habe es nun erstmal wie folgt versucht
Auf den ertsen Blick scheint es zu funktionieren. Vielleicht fällt jemanden noch was auf!
LG
Danke für eure Hilfe!
Ich habe es nun erstmal wie folgt versucht
Code: Alles auswählen
procedure TForm1.Button8Click(Sender: TObject);
var
sl1,sl2,sl3: TStringList;
nz1,nz2: integer;
ergebnis: single;
begin
sl1 := TStringList.Create;
sl2 := TStringList.Create;
sl3 := TStringList.Create;
sl1.LoadFromFile('C:\Strombedarf.txt');
sl2.LoadFromFile('C:\StromEFHUWH.txt');
for nz1:=0 to sl1.Count-1 do begin
for nz2:=0 to sl2.Count-1 do begin
ergebnis:= StrToFloat(sl1[nz1])*StrToFloat(sl2[nz2]);
sl3.Add(FloatToStr(ergebnis));
end;
end;
sl3.SaveToFile('C:\test.txt');
sl1.Free;
sl2.Free;
sl3.Free;
end;
Auf den ertsen Blick scheint es zu funktionieren. Vielleicht fällt jemanden noch was auf!
LG
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Memo zu klein?
vielleicht noch ein try...except um die Zeile mit StrtoFloat, denn hier kanns knallen, wenn der String in keine Zahl umgewandelt werden konnte.
.
Re: Memo zu klein?
Hallo,
vom Prinzip her macht es wenig Sinn die Daten von sl2 wieder und wieder umzuwandeln.
Man kann mit ganz normalen AssignFile und readln und writeln arbeiten, wenn man einen entsprechend großen Textbuf einrichtet ist es kein Leistungsverlust
( SIehe http://www.entwickler-ecke.de/topic_Seh ... 13231.html ) gegenüber einer Stringlist und man muss nicht alle Daten im Speicher behalten.
Dazu bietet es sich an, die Daten aus C:\StromEFHUWH.txt nur einmal in ein FHUWH : array of double umzuwandeln.
Solange es Werte in C:\Strombedarf.txt gibt, diese mit den Werten aus FHUWH verrechnen und direkt in C:\test.txt wegschreiben.
Gruß Horst
vom Prinzip her macht es wenig Sinn die Daten von sl2 wieder und wieder umzuwandeln.
Man kann mit ganz normalen AssignFile und readln und writeln arbeiten, wenn man einen entsprechend großen Textbuf einrichtet ist es kein Leistungsverlust
( SIehe http://www.entwickler-ecke.de/topic_Seh ... 13231.html ) gegenüber einer Stringlist und man muss nicht alle Daten im Speicher behalten.
Dazu bietet es sich an, die Daten aus C:\StromEFHUWH.txt nur einmal in ein FHUWH : array of double umzuwandeln.
Solange es Werte in C:\Strombedarf.txt gibt, diese mit den Werten aus FHUWH verrechnen und direkt in C:\test.txt wegschreiben.
Gruß Horst
Re: Memo zu klein?
@baumina: Danke für den Tip, habe ich ergänzt!
@Horst_h: Danke! Das werde ich mir mal genauer anschauen!
@Horst_h: Danke! Das werde ich mir mal genauer anschauen!