Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Große Dateien in den Speicher laden (https://www.delphipraxis.net/52139-grosse-dateien-den-speicher-laden.html)

derDoc 24. Aug 2005 11:55


Große Dateien in den Speicher laden
 
Ich stehe vor einem kleinen Problem:

Ich möchte eine Datei (1-2 GB) in teilweise in den Speicherladen, sodass ich jeweils immer mit einem Block arbeiten kann.
Leider gelingt mir das nicht so.

Die Blöcke sollen die Größe 9.728.000 Bytes haben. Leider will mein Delphi keine Arrays von dieser Größe erstellen (EStackOverflow). Gibt es eine andere Möglichkeit, diesen Block in den Speicher zu bekommen?

Welche Arten von Buffern können diese Mengen an Daten aufnehmen?

dfried 24. Aug 2005 12:02

Re: Große Dateien in den Speicher laden
 
Ein TMemoryStream muesste das auf jeden Fall können, aber was willst du denn mit den daten machen bzw. wie sehen die Daten denn aus?

Gruß
Daniel

derDoc 24. Aug 2005 12:10

Re: Große Dateien in den Speicher laden
 
Also die Daten sind ganz normale Dateien (binär). Ich möchte daraus dann einzelne Blöcke auslesen und hashen.

Kannst du das mit dem MemoryStream mal etwas genauer benennen?

SirThornberry 24. Aug 2005 12:36

Re: Große Dateien in den Speicher laden
 
warum willst du die gesammte Datei in den Memory laden? Für diesen Zweck gibt es MemoryMapped files oder so ähnlich.

dfried 24. Aug 2005 12:39

Re: Große Dateien in den Speicher laden
 
Nur so mal als kleines Beispiel:

Delphi-Quellcode:
var fs : TFileStream;
    ms : TMemoryStream;
    anz : Integer;
begin
  fs := TFileStream.Create(ExtractFilePath(Application.ExeName)+'XXX.zip',fmOpenRead);
  ms := TMemoryStream.Create;
  try
    while fs.Size > fs.Position do begin
      if (fs.Size - fs.Position) > 9728000 then
        anz := 9728000
      else
        anz := (fs.Size - fs.Position);
      ms.Clear;
      ms.CopyFrom(fs,anz);
      // Hier kannst du jetzt mit den Daten im Speicher etwas machen
      ....
    end;
  finally
    ms.Free;
    fs.Free;
  end;

Gruß
Daniel

Olli 24. Aug 2005 14:19

Re: Große Dateien in den Speicher laden
 
Definitiv MMFs benutzen und jeweils den View verschieben!

Zitat:

Zitat von derDoc
Die Blöcke sollen die Größe 9.728.000 Bytes haben. Leider will mein Delphi keine Arrays von dieser Größe erstellen (EStackOverflow). Gibt es eine andere Möglichkeit, diesen Block in den Speicher zu bekommen?

Autsch :wall: ... du legst doch nicht etwa statische Arrays dieser Größe an? Da ist keineswegs Delphi schuld. Solche riesigen Dinger packt man niemals auf den Stack sondern immer auf den Heap. Also nicht auf Delphi fluchen, bitte!

derDoc 25. Aug 2005 07:37

Re: Große Dateien in den Speicher laden
 
Gut, ich werde mir mal die Memory Mapped Files ansehen. Außerdem werde ich mal schauen, inwieweit ich die Blöckgröße weiter aufspalten kann.

Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz