Meinews.de  


Zurück   Meinews.de > Forum > Newsgroups microsoft.public.de.* 1 Forum > Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp
Registrieren FAQ Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren

Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp Forum microsoft.public.de.german.entwickler.dotnet.csharp

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 10-30-2009, 03:17 PM
FakeAddress
 
Beiträge: n/a
Standard Byte Array OutOfMemory

Hallo NG,

Ich habe eine Kurze Frage.

Ich lese unter anderem Dateien die 200 Mb Gross sind oder auch 500MB,
die meisten sind aber kleiner. Vieleicht ist das auch eine Unglückliche
Lösung die ich da habe.

Wie kann ich eine Speicherproblematik bei Byte[] umgehen oder aussschalten?

Ist vieleicht ein Stream besser, obwohl im Speicher die Abarbeitung
flotter ist?

Ich frage, weil ich nicht alles auf Stream umschreiben will, wenn es
vieleicht eine Lösung mit Byte[] gibt.

Hier der Source des Übeltäters
(in abgewandelter Form im Internet zu finden)

//dieses gibt es auch in umgekehrter Weise
private byte[] StrToByteArray(string str)
{
Encoding enc = Encoding.Default;
return enc.GetBytes(str);
}

--
Liebe Gruesse Richie
http://bmss.homelinux.org/
Wenn du denkst, du denkst, dann denkst du nur du denkst, drum denke nie
gedacht zu haben, denn das Denken von Gedanken ist gedankenloses denken.
Mit Zitat antworten
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Meinews.de
Standard Sponsored Links

  #2  
Alt 10-30-2009, 04:12 PM
Richard Maurer
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

FakeAddress schrieb:
> Hallo NG,
>

Sorry,
Da hat was mit dem Namen nicht funktioniert.
Lg


> Ich habe eine Kurze Frage.
>
> Ich lese unter anderem Dateien die 200 Mb Gross sind oder auch 500MB,
> die meisten sind aber kleiner. Vieleicht ist das auch eine Unglückliche
> Lösung die ich da habe.
>
> Wie kann ich eine Speicherproblematik bei Byte[] umgehen oder aussschalten?
>
> Ist vieleicht ein Stream besser, obwohl im Speicher die Abarbeitung
> flotter ist?
>
> Ich frage, weil ich nicht alles auf Stream umschreiben will, wenn es
> vieleicht eine Lösung mit Byte[] gibt.
>
> Hier der Source des Übeltäters
> (in abgewandelter Form im Internet zu finden)
>
> //dieses gibt es auch in umgekehrter Weise
> private byte[] StrToByteArray(string str)
> {
> Encoding enc = Encoding.Default;
> return enc.GetBytes(str);
> }
>



--
Liebe Gruesse Richie
http://bmss.homelinux.org/
Wenn du denkst, du denkst, dann denkst du nur du denkst, drum denke nie
gedacht zu haben, denn das Denken von Gedanken ist gedankenloses denken.
Mit Zitat antworten
  #3  
Alt 10-30-2009, 04:26 PM
Elmar Boye
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Hallo Richie,

"FakeAddress" <""bergo\"*nosp.at(FakeAddress)"> schrieb ...
> Ich lese unter anderem Dateien die 200 Mb Gross sind oder auch 500MB, die meisten sind aber kleiner. Vieleicht ist das auch eine
> Unglückliche Lösung die ich da habe.
>
> Wie kann ich eine Speicherproblematik bei Byte[] umgehen oder aussschalten?



Die Problematik kann man nicht. Arrays sind begrenzt auf den verfügbaren Speicher.

> Ist vieleicht ein Stream besser, obwohl im Speicher die Abarbeitung flotter ist?


Bei großen Dateien ist der Rückgriff auf einen FileStream oder eine
Inkarnation davon.

> Ich frage, weil ich nicht alles auf Stream umschreiben will, wenn es vieleicht eine Lösung mit Byte[] gibt.


Ob da eine Mischung von Array und Stream möglich/sinnvoll ist, hängt vom
jeweiligen Einsatzzweck ab. Durch eine aufgebohrten Stream könnte
man Teile der Datei im Speicher halten und die Zahl der Zugriffe
reduzieren, wenn mehrfach auf den gleichen Bereich gearbeitet wird.

Da müsstest Du aber konkreter werden.

> //dieses gibt es auch in umgekehrter Weise
> private byte[] StrToByteArray(string str)
> {
> Encoding enc = Encoding.Default;
> return enc.GetBytes(str);
> }


Wenn Du mit Bytes arbeitest, solltest Du direkt über einen FileStream
zugreifen und nicht erst eine Zeichenkette dazwischen schalten und konvertieren.
Das verschärft die Speicherproblematik nur, da auch die Zeichenkette
speicher abknappst.

Gruß Elmar


Mit Zitat antworten
  #4  
Alt 10-30-2009, 06:31 PM
Richard Maurer
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Elmar Boye schrieb:

Hallo Elmar,
Danke für Deine Info und Erklärung.

>
> Die Problematik kann man nicht. Arrays sind begrenzt auf den verfügbaren
> Speicher.
>


Das ist mir wohl bekannt, nur habe ich gehofft, dass es möglichkeiten
gibt eventuell die Speichernutzung zu Optimieren oder zu erweitern.

>
> Ob da eine Mischung von Array und Stream möglich/sinnvoll ist, hängt vom
> jeweiligen Einsatzzweck ab. Durch eine aufgebohrten Stream könnte
> man Teile der Datei im Speicher halten und die Zahl der Zugriffe
> reduzieren, wenn mehrfach auf den gleichen Bereich gearbeitet wird.
>
> Da müsstest Du aber konkreter werden.
>


Es ist relativ einfach erklärt.
Ich habe eine Maschinendatei welche mit Steuerzeichen HEX1E und HEX1D
begrenzt ist.
Dieser Programmteil ist dazu da, die Datei zu kontrollieren, ob alles
passt. Dies erfolgt mittels einfacher Layoutausgabe im Fenster. Mittels
Buttons kann man in der Datei navigieren.
Ein Button davon nennt sich "Rewrite", mit dem kann man fehlende
Features nachbessern (z.B.: Felder glätten oder Satznummerierung
einfügen, Codepage Ändern, usw.). Dann wird die Datei neu geschrieben.
Diese Korrekturen wollte ich in einem Array bewektstelligen, um
schneller zu sein. Eine Kontrolle soll ja nicht so lange dauern wie der
eigenliche Lauf.
Das wars gg

>> //dieses gibt es auch in umgekehrter Weise
>> private byte[] StrToByteArray(string str)
>> {
>> Encoding enc = Encoding.Default;
>> return enc.GetBytes(str);
>> }

>
> Wenn Du mit Bytes arbeitest, solltest Du direkt über einen FileStream
> zugreifen und nicht erst eine Zeichenkette dazwischen schalten und
> konvertieren.
> Das verschärft die Speicherproblematik nur, da auch die Zeichenkette
> speicher abknappst.
>


Im Normalfall, arbeite ich generell mit Streams.
Nur hat sich, warum auch immer der Gedanke manifestiert, dass ich Bytes
nehme, um effektiver zu werden. Ich habe mir gedacht, dass es mit Bytes
nicht sinnvoll ist so grosse Daten zu bearbeiten. Ich hatte gehofft C#
verwaltet den Speicher so damit das untergebracht werden kann.
Aber ich denke ich werde mir die Arbeit antun alles umzustellen, alleine
damit die Logik immer optimal läuft und keine bösen Überaschungen
passieren können.

Danke Dir nochmals

--
Liebe Gruesse Richie
http://bmss.homelinux.org/
Wenn du denkst, du denkst, dann denkst du nur du denkst, drum denke nie
gedacht zu haben, denn das Denken von Gedanken ist gedankenloses denken.
Mit Zitat antworten
  #5  
Alt 11-02-2009, 12:17 PM
Thomas Scheidegger
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Hallo Richard


>> Arrays sind begrenzt auf den verfügbaren Speicher.

> Das ist mir wohl bekannt, nur habe ich gehofft, dass es möglichkeiten gibt
> eventuell die Speichernutzung zu Optimieren oder zu erweitern.



diese 'Optimierung' heisst heute allgemein:
64-Bit Windows + .NET.
(wobei selbst bei 64-Bit .NET oft 2GB Limits leider noch weiterhin gelten)

Auch eine (uva) Möglichkeit wäre manchmal:
'memory mapped files', ab .NET 4.0 auch im Framework drin (ansonst ggf
PInvoke).

Unter 32-Bit Windows/.NET
generell gelten Instanzen von ~500MB (oder mehr) als 'kritisch',
wegen default 2G/2G Splitting, Adressraum-Fragmentierung und div. anderen
Limiten.
(und recht abhängig von System/Windows-Konfiguration, sprich
'unvorhersehbar')
Dies oft selbst bei Vollausbau mit zB 4GB RAM.



--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Mit Zitat antworten
  #6  
Alt 11-03-2009, 01:32 PM
Maurer Richard
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Thomas Scheidegger schrieb:

Hi Thomas,

Sehr aufschlussreiche Information, danke.
Da ich in der Firma warscheinlich in den nächsten 10 Jahren keine 64Bit
Geräte bekommen werde, ist die Marschrichtung klar.
Sparen ... gg
Stream ist am sichersten, da ich mir Dateien im Extremfall von 1,5 Mio.
AdressSätzen arbeiten muss.
Das ist eine 450Mb grosse Datei, die natürlich mit andrerer Satzgröße
varrieren kann.
Aber dennoch habe ich hier mit Speicherverarbeitung den "Schlauch"
(keine Chance).

Ich Danke allen die mir Informationen geliefert haben.
Ich habe ja schon geschrieben, dass ich das umstellen werde, weil man ja
vorher nicht weis, wie der nächste Kunde drauf ist und was für Daten der
schickt ggg
Lg Richie
> Hallo Richard
>
>
>>> Arrays sind begrenzt auf den verfügbaren Speicher.

>> Das ist mir wohl bekannt, nur habe ich gehofft, dass es möglichkeiten
>> gibt eventuell die Speichernutzung zu Optimieren oder zu erweitern.

>
>
> diese 'Optimierung' heisst heute allgemein:
> 64-Bit Windows + .NET.
> (wobei selbst bei 64-Bit .NET oft 2GB Limits leider noch weiterhin
> gelten)
>
> Auch eine (uva) Möglichkeit wäre manchmal:
> 'memory mapped files', ab .NET 4.0 auch im Framework drin (ansonst
> ggf PInvoke).
>
> Unter 32-Bit Windows/.NET
> generell gelten Instanzen von ~500MB (oder mehr) als 'kritisch',
> wegen default 2G/2G Splitting, Adressraum-Fragmentierung und div.
> anderen Limiten.
> (und recht abhängig von System/Windows-Konfiguration, sprich
> 'unvorhersehbar')
> Dies oft selbst bei Vollausbau mit zB 4GB RAM.
>
>
>



--
Grüsse aus Tulln an der Donau

Es ist besser zu sagen was man meint, als nur zu meinen was man sagt.(ein gscheiter Mensch)
Lange Rede kurzer Sinn, versteht nicht jeder was man will. (war der noch gscheiter??)
Mit Zitat antworten
  #7  
Alt 11-03-2009, 04:15 PM
Immo Landwerth
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Maurer Richard wrote:

> Da ich in der Firma warscheinlich in den nächsten 10 Jahren keine
> 64Bit Geräte bekommen werde, ist die Marschrichtung klar. Sparen ...


Jetzt echt? Nahezu alle Hardware aus den letzten Jahren ist 64-bit -
selbst das 3 Jahre alte Media Markt Notebook meiner Freundin ist
64-bit. Natürlich ist nur ein 32-bit OS installiert, aber das ist ja ab
Vista mehr ein Frage der Wahl und weniger ein Frage des Geldbeutels...

--
Immo Landwerth
Mit Zitat antworten
  #8  
Alt 11-03-2009, 09:11 PM
Michael v. Fondern
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Hallo Richard,
> Das ist eine 450Mb grosse Datei, die natürlich mit andrerer Satzgröße
> varrieren kann.
> Aber dennoch habe ich hier mit Speicherverarbeitung den "Schlauch"
> (keine Chance).


mit 2GB RAM kannst du vielleicht schon noch eine derart große Datei
komplett als Byte-Array im Hauptspeicher halten. Allerdings sollte dein
Programm so aufgebaut sein, dass dieses Array wirklich nur ein
einzigesmal existiert, und auch zwischendurch nicht kopiert wird. Also,
wenn ich mir deinen Code hier ansehe

>private byte[] StrToByteArray(string str)
>{
> Encoding enc = Encoding.Default;
> return enc.GetBytes(str);
>}



Wenn "StrToByteArray" ein Byte-Array mit 450 Mio Bytes zurückliefert,
dann waren im String str bereits 450 Mio Zeichen - und da String Unicode
(mit 2 Bytes pro Zeichen!) unterstützt, belegt dass dann rund 900Mio
Bytes zusätzlich, d.h. hier sind schon 1350 Mio Bytes verbraucht.
Solchen Code solltest du tunlichst vermeiden.

Grüße

- Michael -
Mit Zitat antworten
  #9  
Alt 11-05-2009, 09:57 AM
Maurer Richard
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

Michael v. Fondern schrieb:

Hallo Michael,
> Also, wenn ich mir deinen Code hier ansehe
>
> >private byte[] StrToByteArray(string str)
> >{
> > Encoding enc = Encoding.Default;
> > return enc.GetBytes(str);
> >}

>
>
> Wenn "StrToByteArray" ein Byte-Array mit 450 Mio Bytes zurückliefert,
> dann waren im String str bereits 450 Mio Zeichen - und da String
> Unicode (mit 2 Bytes pro Zeichen!) unterstützt, belegt dass dann rund
> 900Mio Bytes zusätzlich, d.h. hier sind schon 1350 Mio Bytes
> verbraucht. Solchen Code solltest du tunlichst vermeiden.
>

Tja und wie Du recht hast .... gg
Ich habe mir eine Testdatei gemacht mit 1,2 Mio Sätzen zu 444 Zeichen. =
519MB, danach habe ich die Datei auf 500000 Sätze Reduziert.= 222MB.

Ich bin natürlich drauf gekommen, dass ich ja die eingelesenen
Filedaten (byte[] ByteList) in ein StringArray umwandle und daher
wiederum das Selbe an Mem benötige (Schwachsinn gg).
Danach habe ich gedacht ich ermittele alle Informationen aufgrund des
ByteArrays und NULLe es dann um wieder die Kapazität zu haben.
Tja, schmorrn. wieder OutOf Mem.
Ich habe gelesen, dass der Speicher erst im nächsten Umlauf. geleert
wird. *System.GC.Collect();* arbeitet so.

Ich kann auch mittels TextReader einlesen, aber da muss ich wieder die
Satzlänge wissen.
Die Datei ist immer eine Binäre mit Fixer Länge und Gruppen und Zeilen
Delimiter, also keine CrLf Datei.
Hier den Satz zu ermitteln war der Grund, dass ich auf die Byte[]
variante gekommen bin.

Jetz wäre es schön, wenn jemand eine effektive Logik kennt die genau das
macht. Im Moment steh ich auf der Leitung gg

Lg Richie

--
Grüsse aus Tulln an der Donau

Es ist besser zu sagen was man meint, als nur zu meinen was man sagt.(ein gscheiter Mensch)
Lange Rede kurzer Sinn, versteht nicht jeder was man will. (war der noch gscheiter??)
Mit Zitat antworten
  #10  
Alt 11-05-2009, 12:37 PM
Thomas Scheidegger
 
Beiträge: n/a
Standard Re: Byte Array OutOfMemory

>> 900Mio Bytes zusätzlich, d.h. hier sind schon 1350 Mio Bytes verbraucht.
>> Solchen Code solltest du tunlichst vermeiden.

> Tja und wie Du recht hast ....


btw,
auch diverse .NET Methoden wie:
File.ReadAllText/ReadAllLines bzw StreamReader.ReadToEnd oä
scheinen 'unglücklich' gelöst und belegen temporär viel/vielfaches an
Speicher.

Mir wäre gerade keine 'safe' C# Methode bekannt,
eine grosse Textdatei (müsste dann UTF-16 sein)
_direkt_ 1:1 in einen .NET String (prinzipiell 'UTF-16')
einzulesen, ohne dass irgendwo dazwischen umkopiert/umcodiert wird
oder sonstige temporäre Instanzen entstehen
(bzw mehrfaches collection-/StringBuilder-resizing oä).
Möglich dass es mit 'unsafe' oder C++/CLI oder via native-interop einen
workaround gäbe.

Vielleicht könntest du auch eine Lösung finden,
die vom grossen Byte-array nur nach und nach kleinere 'Ausschnitte' nach
String wandelt,
aber dies wäre im Prinzip auch schon wieder relativ nahe an der klassischen
Stream-Lösung.
Eine Low-Level Lösung rein auf Byte-Array (raw Ascii-Codes) gänzlich ohne
..NET 'String'
ist natürlich prinzipiell auch stets möglich.


--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Mit Zitat antworten
 
Antwort


Themen-Optionen
Ansicht

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 anzufügen
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten

vB Code ist An
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
Byte Array als Input Source Philipp Kraus Newsgroup de.comp.lang.java 1 05-09-2009 05:27 PM
Byte Array kopieren Christian Havel Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp 4 07-23-2008 06:53 AM
Byte-Array in String Herbert Bodner Newsgroups microsoft.public.de.fox 3 03-26-2008 02:05 PM
byte Array auf C# Christian Havel Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp 3 03-10-2008 04:05 PM
stream in array of byte (.net) Jocke Esser Newsgroup de.comp.lang.delphi.misc 3 12-20-2007 04:24 PM


Alle Zeitangaben in WEZ. Es ist jetzt 08:14 AM Uhr.





Powered by: vBulletin Version 3.6.7 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Forum SEO by Zoints