AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Dateien mit Indy versenden, Problem mit großen Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien mit Indy versenden, Problem mit großen Dateien

Ein Thema von MuTzE.Y85 · begonnen am 4. Nov 2015 · letzter Beitrag vom 6. Nov 2015
Antwort Antwort
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#1

Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 4. Nov 2015, 09:33
Hi Leute,

ich habe mir ein kleines Tool geschrieben um Dateien übers Internet auszutauschen.
Das funktioniert soweit auch erstmal bis auf das Problem, dass bei "großen" Dateien (z.B. bei knapp 400 MB)
die Meldung kommt: "Zu wenig Arbeitsspeicher".

Kompiliere ich die Anwendung als 64-bit funktioniert es ohne Probleme.
Zur Info, das System hat 16 GB RAM.

Kann mir jemand sagen, wo ich den Fehler mache?
Bei wirklich großen Dateien hätte ich es ja verstanden aber schon bei 400 MB?


Vielen Dank schonmal!



Hier mal der Quellcode:

CLIENT
Delphi-Quellcode:
procedure TForm1.SendFile(aFileName: String);
var
  fs: TFileStream;
begin
  with IdTCPClient do
  begin
    fs := TFileStream.Create(aFileName, fmOpenRead or fmShareDenyWrite);
    try
      // Dateiname übertragen
      IOHandler.WriteLn('FT_FILENAME:' + ExtractFileName(aFileName));
      IOHandler.WriteBufferOpen;
      try
        // Datei übertragen
        IOHandler.Write(fs, 0, True);
        IOHandler.WriteBufferClose;
      except
        IOHandler.WriteBufferCancel;
        raise;
      end;
    finally
      fs.Free;
    end;
  end;
end;

SERVER
Delphi-Quellcode:
procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
  fs: TFileStream;
  CommandString: String;
begin
  AContext.Connection.IOHandler.CheckForDataOnSource(10);
  if not AContext.Connection.IOHandler.InputBufferIsEmpty then
  begin
    // Befehl empfangen
    CommandString := AContext.Connection.IOHandler.ReadLn;

    if CommandString.StartsWith('FT_FILENAME:') then
    begin
      // Dateiname auslesen
      CommandString := Copy(CommandString, 13, CommandString.Length - 12);
      fs := TFileStream.Create('D:\TEST\' + CommandString,
        fmCreate or fmShareExclusive);
      with AContext.Connection do
        try
          // Datei empfangen
          IOHandler.ReadStream(fs, -1, False);
        finally
          fs.Free;
        end;
    end;
  end;
end;
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 4. Nov 2015, 12:57
Vermutlich ist zu wenig zusammenhängender Speicher unter 32-bit verfügbar. Beim Auswerten der Logfiles meines Webservers (1&1) ist mir aufgefallen, daß zahlreiche Clients Dateien stückweise herunterladen werden (Responce-Code 206), wenn die ganze Datei eine gewisse Größe überschreitet. Wie das genau vonstatten geht, vermag ich derzeit nicht zu beschreiben, aber vielleicht genügt dir dieser Hinweis, um eine Lösung für dein Problem zu entwickeln (Stichwort Teil-Download). Wenn ich das richtig beobachte, machen das die gängigen Browser auch nicht anders, denn beim Download erscheint immer eine Temp-Datei, die nach & nach größer wird.
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#3

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 4. Nov 2015, 15:08
      IOHandler.WriteBufferOpen;         IOHandler.WriteBufferClose;
Den WriteBufferOpen/Close darf nicht verwendet werden, das sonst alles erst über den Buffer gehen muss, bevor versendet wird. Das will man bei großen Daten genau vermeiden.
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#4

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 4. Nov 2015, 17:05
Hey super! Genau das war das Problem

Danke euch!
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 5. Nov 2015, 11:14
Dein RAM, bzw. der virtuelle Arbeitsspeicher deines Prozesses/Programms, ist fragmentiert.
Überall liegen die EXE, DLLs und sonstiges Zeug im Speicher.

Bei 32 Bit hast du (standardmäßig) nur knapp 2 GB RAM zur Verfügung und dann versuche da mal ein großes zusammenhängendes freies Stückchen zu bekommen.
Mehr als 700 MB sind fast nie mäglich und ab 350 MB wird es ganz schön schwer.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#6

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 5. Nov 2015, 19:30
Und wenn ich WriteBufferOpen weglasse stückelt er es vonn alleine ja?

Kann das WriteBufferCancel eigentlich nicht auch raus nach dem except?
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#7

AW: Dateien mit Indy versenden, Problem mit großen Dateien

  Alt 6. Nov 2015, 09:37
Und wenn ich WriteBufferOpen weglasse stückelt er es vonn alleine ja?
Ja, Es wird dann in den Buffergrößen verschickt. Default ist 32 kB.

Kann das WriteBufferCancel eigentlich nicht auch raus nach dem except?
Ja.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz