Memo zu klein?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
gillian_x
Beiträge: 30
Registriert: Sa 22. Nov 2014, 14:24

Memo zu klein?

Beitrag von gillian_x »

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

Socke
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?

Beitrag von Socke »

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.)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
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?

Beitrag von pluto »

Probiere es einfach mal aus und sonst verwende SynEdit bzw. SynMemo
MFG
Michael Springwald

Mathias
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?

Beitrag von Mathias »

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

Horst_h
Beiträge: 72
Registriert: Mi 20. Mär 2013, 08:57

Re: Memo zu klein?

Beitrag von Horst_h »

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.

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

Mathias
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?

Beitrag von Mathias »

Was hast du mit so einer grossen Stringlist vor ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Memo zu klein?

Beitrag von creed steiger »

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.

gillian_x
Beiträge: 30
Registriert: Sa 22. Nov 2014, 14:24

Re: Memo zu klein?

Beitrag von gillian_x »

Hi!

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

baumina
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?

Beitrag von baumina »

vielleicht noch ein try...except um die Zeile mit StrtoFloat, denn hier kanns knallen, wenn der String in keine Zahl umgewandelt werden konnte.
.

Horst_h
Beiträge: 72
Registriert: Mi 20. Mär 2013, 08:57

Re: Memo zu klein?

Beitrag von Horst_h »

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

gillian_x
Beiträge: 30
Registriert: Sa 22. Nov 2014, 14:24

Re: Memo zu klein?

Beitrag von gillian_x »

@baumina: Danke für den Tip, habe ich ergänzt!

@Horst_h: Danke! Das werde ich mir mal genauer anschauen! :)

Antworten