19. marts 2007 - 16:08Der er
11 kommentarer og 1 løsning
Gem af datafiler vha. TFilestream
Hej,
Jeg bruger TFilestream til at gemme nogle meget store datastrukturer i - det virker OK, men det er LANGSOMT!! - synes ikke det gør "gemningen" af datastrukturerne hurtigere end det at gemme i .txt vha. writeln.
Vil det sige at den eneste fordel ved at bruge TFilestream fremfor simpel ASCII filer (*.txt) er at den kan gemme en linien længere end 255 karakterer? TFilestream er altså hverken hurtigere eller bedre til at komprimere dataene?
Er der en anden måde at gemme meget store datamænder på HURTIGT og gerne også komprimeret?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg har brugt noget med en OrgSize fordi det skulle man bruge til udpakning, den gang jeg brugte zlib, så du må kigge i hjælpen for at se om man stadig skal det
du kan også teste med en TStringList, det brugte jeg på et tidspunkt med stort held, fordi jeg havde den samme oplevelse som dig, stringlist var mærkbart den hurtigste måde, af uforklarlige årsager :)
MANGE tak for svaret - jeg accepterer det naturligvis og du får pointene... men kan du ikke lige hjælpe lidt mere - jeg er lidt grøn mht. TStream, Tbuffer etc. - hvordan "putter" jeg en string ind i Tstream i en for-løkke og hvordan gemmer jeg filen med et eller andet filnavn?
Iøvrigt - hvad betyder "sofrombeginning" i din kode herover?
// Push and Pop helper functions function GetStr(AStream: TStream): String; VAR Len : Integer; begin AStream.Read(Len,SizeOf(Len)); Result := ''; if Len > 0 then begin SetLength(Result,Len); AStream.Read(Result[1],Len); end; end;
procedure PutStr(AStr: String; AStream: TStream); VAR Len : Integer; begin Len := Length(AStr); AStream.Write(Len,SizeOf(Len)); if Len > 0 then AStream.Write(Astr[1],Len); end;
function GetInt( aStream : TStream ) : Integer; begin AStream.Read(Result,SizeOf(Result)); end;
function GetStream( aStream : TStream ) : TStream; VAR Len : Integer; begin Result := TMemoryStream.Create; AStream.Read(Len,SizeOf(Len)); if Len > 0 then Result.CopyFrom(aStream,Len); Result.Position := 0; end;
procedure PutStream( aValue,aStream : TStream ); VAR Len : Integer; begin Len := aValue.Size; AStream.Write(Len,SizeOf(Len)); aValue.Position := 0; AStream.CopyFrom(aValue,Len); end;
Lige et sidste spørgsmål - skal jeg skrive strings ind i Tstream og når alle strings er i TStream så benytter jeg TCompressionstream - eller skal jeg skrive fra strings til TStream til TCompression kontinuerligt?
Hæld dinne data ind i en stream ( der er af passende type ) og pak den og gem den, læs den ind pak den ud så du ender med en TStream af den type du skal bruge :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.