unsigned byte?

vimar

Bekanntes Mitglied
irgendwas frisst bei mir unmengen speicher.. muss ca 400 textfiles parsen und alle in einer riesigen arralist speichern... scheinbar hier 7 GB.. wollte daher die werte auf byte runterbrechen... oder fressen die ganzen parserinstanzen soviel? kann das?
 

XHelp

Top Contributor
Du könntest den "on fly" mit
Code:
&0xFF
zum "unsigned" machen, aber das ist eher als hack drumherum zu betrachten und nicht als eine schöne Lösung. Es kommt drauf an was du damit bezwecken willst.

P.S. Du kannst z.B. mit VisualVM nachschauen, was so viel Speicher frisst. Vermutlich sind es aber die Strings.
 

Marco13

Top Contributor
In einer ArrayList stehen Objekte - da ist es fast egal, ob das ein short, int oder byte ist. Kannst du die daten als byte[] oder ggf. short[] array speichern?
 
N

nillehammer

Gast
Die normale Java-VM erweitert die kleinen Ganzzahltypen intern eh zu int. Da spart man also keinen Speicher. Was aber was bringt, ist sich nicht auf Autoboxing zu verlassen und auf gar keinen Fall new Integer zu benutzen, sondern beim adden die Factory-Methode Integer.valueOf zu verwenden. Das wird intern gecached, sodass bei gleichen Werten die Referenz auf ein einziges Objekt zeigt und nicht jedes Mal ein neues angelegt wird. Wobei ich mir ehrlich gesagt nicht sicher bin, dass Autoboxing das nicht evtl. genauso macht.
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Sie erweitert diese Typen - zum Rechnen, und bei einzelnen lokalen Variablen oder Fields. Trotzdem braucht ein
new int[1000];
oder
new Object[1000];
etwa vier mal so viel Speicher wie ein
new byte[1000];

Bei ArrayList kommt noch dazu, dass es "bestimmte Größen ""nicht gibt""": Wenn eine ArrayList mit 1000000 Einträgen voll ist, wird intern ein Array mit 1500000 Elementen erstellt - auch wenn man vielleicht nur 1000001 Elemente braucht.
 

Landei

Top Contributor
So ganz stimmt das nicht: Soweit ich weiß kann man eine [c]ArrayList[/c] auch in kleineren Schritten durch Aufruf von [c]ensureCapacity[/c] vergrößern.
 
N

nillehammer

Gast
Konnte/Wollte Marco nicht glauben und habe mal Testcode geschrieben;
Java:
public final class Main1 {

	private static final int ARR_LENGTH = 10000000;

	/**
	 * @param args
	 */
	public static void main(String[] args ) throws Throwable {

		final Runtime runtime = Runtime.getRuntime();

		System.out.println(runtime.freeMemory());

		final boolean[] arr = new boolean[ARR_LENGTH];

		// final byte[] arr = new byte[ARR_LENGTH];

                // final short[] arr = new short[ARR_LENGTH];

		// final int[] arr = new int[ARR_LENGTH];

		System.out.println(runtime.freeMemory());

	}

}
Habe jeweils den gewünschten Datentyp auskommentiert und siehe da, Marco hat Recht. boolean und byte haben denselben Verbrauch, danach steigt es jeweils an.
 
N

nillehammer

Gast
Landei hat gesagt.:
So ganz stimmt das nicht: Soweit ich weiß kann man eine ArrayList auch in kleineren Schritten durch Aufruf von ensureCapacity vergrößern.
So ganz genau kann man es nicht steuern. Es wird der größere Wert von übergebenem Parameter verglichen mit der Summe aus aktueller Größe plus doppelter aktueller Größe des internen Arrays genommen. Das ganze passiert in der privaten Methode
Code:
grow
.
 
N

nillehammer

Gast
Und um nochmal auf die Ursprungsfrage zurück zu kommen. Basierend auf den Erkenntnissen in diesem Thread ist ein Array von Primitives die effizienteste Wahl. Da Arrays eine fixe Länge haben und Du sicher vor dem Einlesen nicht weißt, wie viele Elemente Du genau brauchst, empfehle ich eine Hilfsklasse (z.B. PrimitiveByteList oder PrimitiveShortList), die einen Array von Primitives als Instanzvariable hält. Die Hilfsklasse muss sich dann beim Adden um das Resizing des Arrays und anschließendes Arrays.copyOf kümmern. Als Vorlage hierfür kannst Du Dir den Quellcode von ArrayList anschauen.
 
B

bygones

Gast
irgendwas frisst bei mir unmengen speicher.. muss ca 400 textfiles parsen und alle in einer riesigen arralist speichern... scheinbar hier 7 GB.. wollte daher die werte auf byte runterbrechen... oder fressen die ganzen parserinstanzen soviel? kann das?

solange du nicht rausgefunden hast, was den speicher frisst ist es unsinnig auf gut wohl mal irgendwelche "optimierungen" zu machen.

Nutz einen Profiler um die Problematik einzugrenzen, dann such eine Loesung.
 

fastjack

Top Contributor
nillehammer hat gesagt.:
Die normale Java-VM erweitert die kleinen Ganzzahltypen intern eh zu int. Da spart man also keinen Speicher.

wo steht das denn? (abgesehen von den internen Erweiterungen zum Rechnen, falls Du die meinst)

nillehammer hat gesagt.:
Was aber was bringt, ist sich nicht auf Autoboxing zu verlassen

aha, mach ich im Notfall persönlich nur, um keine NPE's zu bekommen, aber sonst?

nillehammer hat gesagt.:
auf gar keinen Fall new Integer zu benutzen, sondern beim adden die Factory-Methode Integer.valueOf zu verwenden

was macht denn Integer.valueOf(xxx), was new Integer(xxx) nicht macht? Mal abgesehen von der Byte-Optimierung, also den Zahlen -128 bis +127 die im IntegerCache landen :) Genau, gar nix ;)
 
B

bygones

Gast
was macht denn Integer.valueOf(xxx), was new Integer(xxx) nicht macht? Mal abgesehen von der Byte-Optimierung, also den Zahlen -128 bis +127 die im IntegerCache landen :) Genau, gar nix ;)
aber genau das ist kein Gegenargument Integer.valueOf nicht zu nehmen. Mit valueOf bekommt man entweder gecached oder neue Instanz, mit new immer eine neue Instanz. Daher sollte man immer valueOf nehmen.
 
N

nillehammer

Gast
fastjack hat gesagt.:
wo steht das denn? (abgesehen von den internen Erweiterungen zum Rechnen, falls Du die meinst)
Da bin ich einem Irrtum aufgesessen, den Marco schon einen Tag vor Dir gefunden hat (Post #8) und dem ich auch schon zugestimmt habe (Post #10).
fastjack hat gesagt.:
Mal abgesehen von der Byte-Optimierung, also den Zahlen -128 bis +127 die im IntegerCache landen Genau, gar nix
Da der TO nach Werten bis 200 gefragt hat, ist die Chance, die Cache-Funktionalität nutzen zu können bei mehr als 50%. Insofern ist das doch ein valider Hinweis, oder nicht? Ansonsten schreiben sogar die Jungs von Su.., äh Oracle in den API-Docs, dass valueOf dem Konstruktor vorzuziehen ist.
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
solange du nicht rausgefunden hast, was den speicher frisst ist es unsinnig auf gut wohl mal irgendwelche "optimierungen" zu machen.

Einerseits: Natürlich. Andererseits... wenn jemand eine ("große") Datei mit
Java:
ArrayList<Byte> data = ...
while (...) data.add(readByteFromFile());
einliest, rollen sich mir aus mehr als einem Grund die Fußnägel hoch :autsch: Unabhängig davon, ob was anderes vielleicht auch noch unnötig Speicher frißt.
 

vimar

Bekanntes Mitglied
nach den letzten tests von mir,:

1. alle <Integer> Arraylists als <Short> zu machen -> brachte mir nichts.

2. anstatt new Integer Integer.valueOf -> brachte mir auch nichts.

Der Ram ist immernoch voll wie man hier unschwer erkennt -.-
Der Profiler von netbeans ist mehrfach abgestürzt (komplett netbeans keine rückmeldung bei soviel GB - komisch).

kmeans4threads.jpg
 

XHelp

Top Contributor
Ich habe auch in einem anderem Thema von dir gesagt: es könnte einfach sein, dass du nun mal viel Speicher brauchst. Es kommt stark auf deine Vektor-Darstellung an, idR sind es keine Listen, sondern Maps.
 

Marco13

Top Contributor
nach den letzten tests von mir,:

1. alle <Integer> Arraylists als <Short> zu machen -> brachte mir nichts.

Das ... hätte ich dir auch vorher sagen können ... ein Short braucht genausoviel wie ein Integer oder Byte, und auch eine List<Byte> ist nicht kleiner als eine List<Integer>. Der Unterschied besteht nur bei primitiven arrays: byte[] statt int[]...

Poste halt mal ein bißchen code...
 

fastjack

Top Contributor
Mit dem Taskmanager (und auch noch Windows) ist das etwas schwammig. Nimm einen Java-Profiler, dann bekommst Du exakte Ergebnisse. Wer weis schon, was bei Windows, hier gerade CPU oder RAM frißt.
 

bERt0r

Top Contributor
Richtig, StringTokenizer ist extrem langsam. Benutze Scanner und eine Regex. Wenn du's richtig machst, solltest du dir auch gleich das extra einlesen als String sparen können.
 
Zuletzt bearbeitet:

AngryDeveloper

Bekanntes Mitglied
was macht denn Integer.valueOf(xxx), was new Integer(xxx) nicht macht? Mal abgesehen von der Byte-Optimierung, also den Zahlen -128 bis +127 die im IntegerCache landen :) Genau, gar nix ;)
[OT]Nur ein Random Fact und trägt jetzt zwar nicht zur Lösung bei, aber ich bin selbst vor kurzem über diese Property Einstellung gestoßen, die bei Oracle/Sun JDK (ab 6uIrgendwas) funktioniert:
Code:
-Djava.lang.Integer.IntegerCache.high=2000
[/OT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
B unsigned byte Problem Java Basics - Anfänger-Themen 9
M unsigned byte Java Basics - Anfänger-Themen 4
G String to unsigned byte Java Basics - Anfänger-Themen 12
D Umrechnung dezimal -> oktal | signed/unsigned? Java Basics - Anfänger-Themen 1
M unsigned int Java Basics - Anfänger-Themen 3
S Variablen "c" unsigned int zu Java Java Basics - Anfänger-Themen 2
J unsave signed&unsigned Java Basics - Anfänger-Themen 6
L Integer nach Unsigned Integer Java Basics - Anfänger-Themen 2
M Binärdateien auslesen (unsigned!) Java Basics - Anfänger-Themen 5
H unsigned variablen Java Basics - Anfänger-Themen 2
N unsigned int to long Java Basics - Anfänger-Themen 5
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
U short[] nach byte[] Java Basics - Anfänger-Themen 11
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
H 1 Byte Status Variable Java Basics - Anfänger-Themen 3
P Datentypen Byte und char Typecast Java Basics - Anfänger-Themen 2
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
W Datentypen int -> byte Java Basics - Anfänger-Themen 2
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
F Typenumwandlung byte <=> int verstehen Java Basics - Anfänger-Themen 3
S Byte eines arrays Java Basics - Anfänger-Themen 17
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14
S 2 Byte Arrays addieren Java Basics - Anfänger-Themen 45
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
Z Wie Byte[] in einen String oder int konvertieren Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben