richtige Kombination aus Werte- und Referenztypen

aiirtime

Mitglied
Hallo,

ich habe eine Grundlegende Frage und zwar habe ich sehr viele Elemente die jeweils mehrere(bisher 3) Eigenschaften haben und etwa 30 unterschiedlichen Gruppen zugeteilt werden können.
Mein Ansatz wäre eine Map die als key die Gruppe hat und als value einen Vector der die vielen Elemente speichert(da diese Elemente ruhig als Zahlen representiert werden können) und als value dachte ich an eine Enumeration oder Set.
Das heißt ich würde in etwa sowas erstellen:
Code:
Map<String, Vector<Enum>>
oder
Code:
Map<String, Vector<Set<int>>>

bin ich da auf dem richtigen Weg? Ich habe wenig Erfahrung im Bezug auf die Optimierung.
Ich weiß am Anfang ist die Optimierung nicht wichtig, aber bei diesem Konstrukt ist es wichtig.
Da mehrere dieser Konstrukte in der Software erzeugt werden und pro Gruppe mehrere Millionen Elemente mit den dazugehörigen Eigenschaften existieren. Ich denke das ich da schnell an das Limit komme und wenn die Datenstruktur nicht richtig aufgebaut ist, wird die Software auch sehr langsam.

Gruß Air
 

Gucky

Top Contributor
Ich weiß nicht, ob es dir hilft aber mein Infolehrer hat mir erzählt, wie das bei Telefonbüchern gemacht werden kann: es gibt eine Liste, die Listen enthält, die wiederum Listen enthalten, welche Listen enthalten, etc. Jede dieser Listen repräsentiert einen Buchstaben. Wenn ich also nach Familie Adam suche, gucke ich in die erste Liste, suche nach A, gucke dann in die Liste, die das A repräsentiert und suche dort das d. Dann gucke ich in dieser Liste nach dem a und so weiter, bis ich Adam gefunden habe.
Eigentlich ginge es jetzt noch weiter aber ich glaube, es ist klar geworden, was ich meinte.
Beim Telefonbuch ist es auch noch möglich den Buchstaben als ASCII zu nehmen, minus 94 (a entspricht 94 in ASCII) und schon musst du gar nicht mehr suchen, sondern läufst einfach blind die Listen ab.

Dies mit Klassen aus der API zu lösen wird schwer, weshalb ich dir empfehle das Ganze selber zu schreiben.
Oder habe ich dich falsch verstanden?
 

aiirtime

Mitglied
Hi,

danke für den Hinweis. Ich denke auch das ich da eine eigene Klasse schreiben sollte aber ich weiß immer noch nicht wie ich das verpacke. Das mit den Listen ist nicht schlecht, aber bei deinem Beispiel wäre jede Liste mit 30 einzelnen elementen(Alphabet) ich habe da aber eine voraussichtliche Elementen anzahl von mehreren Millionen deswegen der Vector.

Gruß Air
 

Thallius

Top Contributor
Brauchst du denn ständig alle diese Elemente? Sonst würde ich die in eine Datenbank legen (Speichern wirst du die ja sowiso irgendwie müssen denke ich mal) und die Logik dann der DB überlassen. Sprich entsprechende Crosstables basteln und dann mit den richtigen Queries immer die passenden Elemente holen.

Gruß

Claus
 

aiirtime

Mitglied
Hi,

leider brauche ich diese Elemente, da ich mit denen dann arbeiten möchte. An eine Datenbank dachte ich auch schon, aber die Software soll nicht unnötig aufgebläht werden und der Enduser soll/muss nicht eine Datenbank installieren.
Gibt es da eine überhaupt eine Möglichkeit? Ich denke das ich sehr schnell am Limit vom Speicher bin.

Gruß Air
 

Thallius

Top Contributor
Das denke ich nämlich auch. Man müßte wissen was du eigentlich vorhast um ein vernünftiges Konzept aufstellen zu können

Gruß

Claus
 

aiirtime

Mitglied
Ok,

ich weiß nicht wie ich das am besten beschreibe, aber ich probiere es einfach mal.
Also ich habe einige Gruppen(ca. 30) die sehr viele Elemente(mehrere Millionen ca. 200Millionen) haben und diese Elemente können unterschiedliche Eigenschaften(vorerst 3, aber es können mehr werden ca. 10) haben.
So wie verpacke ich das, damit ich dann entsprechend der Eigenschaften mir die Elemente der jeweiligen Gruppe anzeigen lassen kann.
Achso und die Gruppen können mehrfach vorkommen, z.B. zu unterschiedlichen Zeiten(also das ganze kann mehrfach vorkommen).
Ich hoffe das war ein wenig verständlich:oops:

Gruß Air
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Da würde ich dir dann doch zu einer Datenbank, wie SQL oder SQLite raten. 200 Millionen Objekte mit jeweils zehn Eigenschaften mit unbekannter Größe gehen dann doch sehr auf den Speicher um nicht zu sagen, sprengen ihn.
Das Anzeigen kannst du so machen, dass du zum Beispiel immer 100 Elemente lädst und diese anzeigst. Zusätzlich implementierst du einen weiter und einen zurück Button, mit dem die nächsten oder die letzten 100 Elemente geladen werden können.
 

Thallius

Top Contributor
Alleine das Hantieren mit 200 Millionen Elementen hört sich für mich schon stark nach einem Konzeptfehler an. Aber wie gesagt. Ohne genaue Infos was du eigentlich programmieren willst können wir auch nicht helfen.

Aber wahrscheinlich ist Deine Idee wieder so bahnbrechend, dass Du damit reich werden wirst und du deshalb hier nicht darüber reden kannst ;)

Gruß

Claus
 

Gucky

Top Contributor
Vielleicht arbeitet er bei der NSA und es geht um das Speichern der Daten von Brasilien.

Referenzen auf Referenzen gibt es in Java nicht. Dazu müsstest du zu C/C++ wechseln.
Was Zeiger und abstrakte Klassen mit deinem Vorhaben zutun haben, verschließt sich mir aber.
 

aiirtime

Mitglied
@Thallius

Ich verheimliche nichts und meine Idee wird niemanden reich machen. Ich möchte nur diese Datenmenge mittels einer Gui visualisieren und das in Abhängigkeit der Eigenschaften, deshalb sollten die Elemente immer parat sein.
Aber anscheinend gehe ich doch den falschen Weg, ich dachte nur es gibt da eine Möglichkeit ausser mit Hilfe einer Datenbank.

Gruß Air
 

aiirtime

Mitglied
Ich danke euch das ihr euch die Zeit nehmt mir zu helfen.
Entschuldigung das ich mich so komisch ausdrücke, aber ich weiß nicht wie ich sonst das Problem beschreiben soll.
 

aiirtime

Mitglied
Ok,

im Grunde möchte ich zunächst zwei Dateien vergleichen(später mehrere dieser Paare mit anderen Paaren usw.)
Die Dateien enthalten Angaben über Positionen(diese können von 1-260000000 gehen) und das wird dann nochmal in etwa 30 Quartale unterteilt. Die Position kann ein Signal oder mehrere Signale enthalten oder auch kein Signal. Mich interessiert nur ob ein Signal vorhanden und wie viele Signale pro Position enthalten sind. Dann kommen noch die Eigenschaften wie Stärke, Farbe usw.
Und zuletzt möchte ich diese Dateien vergleichen in Abhängikeit der Position.
Also an der Position 10 ist in Datei 1 100 Signale in Datei 2 45 Signale

Gruß Air
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Da kommen wir der Sache schon näher.
Dieser Vergleich soll vermutlich automatisiert ablaufen.
Wie genau soll der Vergleich aussehen also wie würdest du als Mensch daran gehen?
 

aiirtime

Mitglied
Naja pro Position würde ich in jede Datei schauen und mir pro Position, den Dateinamen, das Quartal, die Anzahl der Signale und die Eigenschaften anschauen. Am Ende würde ich dan ger wissen wieviele Positionen haben mindestens 20 Signale und sind rot oderso.
 

Gucky

Top Contributor
Dann könnte sogar MappedMemory (Google) reichen, da du auf die Dateien nur zur Auswertung zugreifen musst.

Zur Vorgehensweise: Du ließt eine Position ein, wertest sie aus und speicherst die Auswertung per RandomAccesFile in einer Index Datei mit gleichbleibender Länge der Elemente. Den Namen dieser Vorgehensweise habe ich grade vergessen aber vielleicht kennt Thallius den.
Vor jedem Schreibvorgang musst du natürlich testen, ob es die Position schon gab und die Auswertung dieser Position nicht überschreiben.
 

aiirtime

Mitglied
Aber ich brauche doch die Informationen der Dateien und zwar pro datei 260000000 positionen * 30 Quartale * Anzahl der Signale * Eigenschaften und zu guter letzt den Datei namen und dann möchte ich vergleichen.
Und der Grund warum ich das in den Speicher legen wollte ist das ich dann per GUI regler für die Eigenschaften anlege und dann z.B. Anzahl 20 setze Farbe rot und pro datei wird mir angezeigt(zur Laufzeit) wieviele Positionen dem entsprechen.
Oder kann man das anders bewerkstelligen? Ist das ein Konzeptionsfehler?

Gruß Air
 

Gucky

Top Contributor
Warum gibt es 30 Quartale? Im Wort Quartal steht schon drin, dass es nur 4 geben kann. Schließlich beschreibt es ein Viertel.

Das wären dann 260000000 * 30 * 25 (Schätzung) * 10 * 2(weil 2 Dateien) = 3900000000000 Vergleiche. Ich glaube IBM hat günstige Supercomputer im Angebot. Vielleicht kannst du da mal fragen.
Das ist sehr wahrscheinlich ein Konzeptionsfehler. Da muss sich ein besserer Weg finden lassen.
 

Thallius

Top Contributor
Die alles entscheidende Frage die Du immer noch nicht beantwortet hast ist:

Was soll der User als Ergebnis denn nun bekommen? Was willst du mit 260000000 Positionen anfangen? Wer soll sich die ansehen?

Das Ergebnis wird doch nur eine Handvoll Informationen sein die ein Mensch auch verarbeiten kann, aber welche?

Gruß

Claus
 

aiirtime

Mitglied
Das mit Quartal ist mein Fehler :oops: es sind Bereiche/Spektren(es wird unterteilt).
Das Ergebnis das der Mensch verarbeiten soll ist dann:
mit reglern sich die gesamtzahl der Positionen anzeigen zulassen.
z.B. regler1-Anzahl=20 regler2-Signalstärke:20 das Ergbnis soll dann die Menge der Positionen die dem entsprechen anzeigen und das in den Dateien (zunächst 2).
Damit der user nicht die Analyse abwarten muss sobald etwas an den Reglern verstellt wird sollte die gesamte Information im Speicher sein.

Vielleicht sollte ich die Positionen zählen die den Regler einstellungen entsprechen und nur die Ergebnisse speichern. Den Regler gebe ich ja vor, die Range sollte bei 1-100 liegen.
Aber dann ist die Erweiterbarkeit nicht so gut?
Vor allem für den Vergleich unter den Dateien fehlen mir dann die Positions-Informationen.

Gruß Air
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Das was Du da machen willst ist prädistiniert für eine DB. Und nein es macht keinen Sinn das alles im speicher zu halten und vorher zu berechnen. Wenn Der User an dem Slider was verstellt schickst du ein Query an die Datenbank mit genau den Parametern die der User eingestellt hatund bekommst dann die neue Anzahl an Positionen zurück. Das sollte bei einem guten DB Design auch nur einen Bruchteil einer Sekunde dauern.

Gruß

Claus
 

aiirtime

Mitglied
Das dachte ich mir schon, vielen Dank für eure Hilfe.
Gibt es da die Möglichkeit eine Datenbank in die Software zu integrieren ohne das der user was machen muss?
Kennt ihr da einpaar links oderso?
Ich hab da sowas gefunden HSQLDB geht das in die richtige Richtung?
Ich brauche eine Datenbank die dann per Software erstellt wird und auf der Festplatte gespeichert wird, aber dazu benötigt der Enduser doch auch die Software oder?

Gruß Air
 
Zuletzt bearbeitet:

aiirtime

Mitglied
Sieht sehr gut aus, Lizenz-frei und klingt nachdem was ich dann bräuchte.
Ich werd mich mal übers Wochenende damit beschäftigen.
Vielen Dank euch allen und für eure Geduld.
Wer noch eine andere Idee hat, immer nur her damit:)
 

aiirtime

Mitglied
Hallo,

hab jetzt etwas herum experimentiert. Hab da noch einpaar Probleme mit der lokalisation der Datenbanken, aber das gehört nicht hier her.
Mein größtes Problem ist gerade das herein laden der Daten. Das dauert sehr lange. Ich glaube das ich da noch einiges falsch mache. Generell sollte man eine Datenbank erstellen die Verbindung aufbauen (in SQLite ist das, das gleiche) und dann die entsprechende Tabelle erstellen. Danach die Daten herein laden. Das macht mann in einem Zug? Ich habe bisher alles einzeln durchgeführt und somit wird pro Datensatz immer wieder eine neue Verbindung aufgebaut.

Gruß Air
 

aiirtime

Mitglied
Naja dann häte ich wieder das Problem das ich erst alle Daten wieder in den Arbeitspeicher haue.
Sollte aber pro Datei noch gehen, ich probier mal weiter.
Gibt es eigentlich eine schöne Anleitung von SQLite in Deutsch?
 

Thallius

Top Contributor
Wenn Du ALLE daten lädst, dann brauchst du keine Datenbank. Klar das es lange dauert ein paar hundert millionen Daten zu laden. Das ist ja auch gerade nicht Sinn der Sache.

Zeig uns mal wie Deine Tabellen so aussehen und welche Queries du darauf machst.

Gruß

Claus
 

aiirtime

Mitglied
Also ich hab die einzelnen Methoden in einer Hilfsklasse angelegt und zu Beginnur die Positionen eingesetzt, nach etwa 20 min waren circa 50000 drin hab dann abgebrochen.
Ich habe die wichtigsten Zeilen heraus geschrieben die Methoden sind nicht ganz vollständig.
Connection, DBCreator, CreatTable und Insert:
Code:
//Connection
Class.forName("org.sqlite.JDBC");
	      Connection connection = DriverManager.getConnection("jdbc:sqlite:"+project_name+".db");

//DBCreator
DBFile = new File(project_name+".db");
		if(DBFile.isFile())
		{
			JOptionPane.showMessageDialog(null, "Database: "+project_name+" still exists. Please insert an other project name", "ERROR", JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else
		{
		    try {
		      Class.forName("org.sqlite.JDBC");
		      ConnectorToDB(project_name);
		      return true;
		    } catch ( Exception e )
		    {
		    	JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
		    	return false;
		    }

//Create Table
Class.forName("org.sqlite.JDBC");
	      c = DriverManager.getConnection("jdbc:sqlite:"+databasefolder.getAbsolutePath()+System.getProperty("file.separator")+project_name+".db");
	      
	      if(c != null)
	      {
	    	  stmt = c.createStatement();
		      String sql = "CREATE TABLE COVERAGE " +
		                   "(ID INT NOT NULL)"; 
		      stmt.executeUpdate(sql);
		      stmt.close();
		      c.close();
		      return true;
	      }
	      else
	      {
	    	  return false;
	      }

//Insert
Class.forName("org.sqlite.JDBC");
	      c = ConnectorToDB(project_name);
	      c.setAutoCommit(false);

	      stmt = c.createStatement();
	      String sql = "INSERT INTO COVERAGE (ID) " +
	                   "VALUES ("+ID+");"; 
	      stmt.executeUpdate(sql);

	      stmt.close();
	      c.commit();
	      c.close();
	      return true;
ausgeführt wird dann folgendermaßen:
1.DBCreator
2.CreateTable
und pro Position 3.Insert
 

Thallius

Top Contributor
Also bevor ich jetzt was ganz falsches sage. Kannst du bitte einfach mal ein paar Zeilen einer Datei hier reinstellen, damit ich mir sicher bin dass ich jetzt auch alles richtig verstanden habe?

Danke

Claus
 

aiirtime

Mitglied
@Thallius Ok also ich habe versucht die Problematik theoretisch zu abstrahieren. Leider ist mir das gar nicht gelungen ;( Zeilen aus den Dateien würden nur noch mehr verwirren. Die Informationen aus den Datein sind die Gruppe, die Position (die ich leider nicht als id nehmen kann da sich diese wiederholt in einer anderen Gruppe) und Eigenschaften (z.B. Signalstärke). In dem Beispiel mit den Methoden habe ich mich erstmal nur auf die ID/Position festgelegt.
Ich hoffe das klingt nicht wieder so geheimnisvoll???:L
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Also ich habe leider immer noch Schwierigkeiten mir Dein Problem genau vorzustellen und deshalb kann ich auch nicht weiter helfen.

Warum postest du nicht einfach mal die ersten 20-30 Zeilen von so einer Datei? Das ist doch viel aussagekräftiger als wenn du hier mit irgendwelchen selbst definierten Begriffen um dich wirfst.

Ich habe keine ahnung was für Dich eine Grupp ist. Gibt es davon auch unendlich viele oder gibt es eine feste Anzahl Gruppen? Die Anzahl an Positionen scheint ja quasi unbegrenzt zu sein. Jedenfalls ist 280 Millionen keine Größenordnung die ich als festen Index verwenden würde.

Ich muss also erstmal ganz genau wissen wie die Daten eigentlich organisiert sind. Dann kann man eine vernünftige DB Planung erstellen mit richtig normalisierten Tabellen und dann kann man mittels eines einfachen queries immer die benötigten Informationen erfragen.

Gruß

Claus
 

aiirtime

Mitglied
Ok es tut mir leid für die ganze Verwirrung, also ich probier es jetzt mal mit den original Daten.
Ich hoffe dadurch wird es verständlicher. Wenn Ihr überhaupt noch Lust habt mir zu helfen.
Also hier mal die ersten 10 Zeilen einer Datei:
Code:
ILLUMINA-398FBB:4:22:4023:18754#0	97	chr1	10016	0	36M	chr15	81600966	0	CCCTAACCCCAACCCTAACCCTAACCCTAACCCTAA	@@?@@BBBBCDDCCCDCDCCCCCDACBDCDBB@@AC	X0:i:637	BD:Z:OONPQPOPMMPOMNLNNMMNLNNNNONPPPQSNPPO	MD:Z:9T26	RG:Z:2_030810_42YV7AAXX_4	XG:i:0	BI:Z:QQPSSRQQOORPPQORRQPQPSSRRSQTTTTUPSSR	AM:i:0	NM:i:1	SM:i:0	XM:i:1	XO:i:0	XT:A:R
ILLUMINA-398FBB:1:87:2358:19551#0	81	chr1	10072	0	36M	chr2	24167152	0	CTAACCCTAACCCTAACCCTAACCCTAACCCTAACC	C=A@ABCACACCDBC6BBCBBCCCDBCBB@B@????	X0:i:635	BD:Z:PNOPQSQOOPMPOMMNLONLMNLOOMNPNQQOOPOO	MD:Z:36	RG:Z:2_030810_42YV7AAXX_1	XG:i:0	BI:Z:RSQRRTTTRSPRRSQRNPQRPQNPQRPQNQRSQRQQ	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	XT:A:R
ILLUMINA-398FBB:3:46:2700:10217#0	73	chr1	10087	0	36M	=	10087	0	ACCCTAACCCTAACCCTAACCCAACCCTAACCCTAA	@?@?A@BABBDCCBCCDCCBCCCCACCDBCAA@AAB	X0:i:5	X1:i:22	BD:Z:OOPNQPOOOMOMMMNLNMMMNLPONONPPPQSNPOO	MD:Z:36	RG:Z:2_030810_42YV7AAXX_3	XG:i:0	BI:Z:QQRPSRRPQORQQPQORQQPRPSRRRQTSTTVPSRR	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	XT:A:R
ILLUMINA-398FBB:3:46:2700:10217#0	133	chr1	10087	0	*	=	10087	0	GGGTCAGGTCAGGTCAGGGTTAGGGTTAGGGTAGGG	<<<<@BBAA>@CBCDDDCCACBDCCBDADCC@<@BC	BD:Z:OONPRQQQOPOPONONOOLNNLPPMOPNRRPSPQQN	RG:Z:2_030810_42YV7AAXX_3	BI:Z:QQORSTSQQRSRPQRSRPNQQSRQOSRTTSRVSRQO
ILLUMINA-398FBB:3:59:10196:7206#0	163	chr1	10187	0	36M	=	10402	251	AACCCTAACTCTAACCCTAACCCTAACCCTAACCCT	;;:<<A>??/>?9=>B>AB=ABBBBCB?CD<=787A	X0:i:632	BD:Z:OOOPOQOONONNMMMNLNMMMNMONNOPOQQROPNP	MD:Z:9C26	RG:Z:2_030810_42YV7AAXX_3	XG:i:0	BI:Z:QQQRPSRRPRNQQQPQORQQQRPSRSRSRUUVQRPS	AM:i:0	NM:i:1	SM:i:0	XM:i:1	XO:i:0	MQ:i:0	XT:A:R
ILLUMINA-398FBB:2:2:6479:7854#0	163	chr1	10189	0	36M	=	10252	99	CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAC	<<<>?BBBBDBDCCCBCDCCCECDCCCCCDCBAA@?	X0:i:12	X1:i:649	BD:Z:OONPPPOPMONNMNLNMMMNLNMNNONPOPQSNPOP	MD:Z:35A0	RG:Z:2_030810_42YV7AAXX_2	XG:i:0	BI:Z:QQPSRRQRPSQQPQORQQPRPSRRRSQTSTSUPSRQ	AM:i:0	NM:i:1	SM:i:0	XM:i:1	XO:i:0	MQ:i:0	XT:A:R
ILLUMINA-398FBB:2:42:14262:1346#0	163	chr1	10193	0	36M	=	10419	262	AACCCTAACCCTAACCCTAACCCTAACCCTAACCCT	<=<<?CBABBBE@DCCCEADCCCEBDCBCEAA?;=B	X0:i:627	BD:Z:OOOPOQOONOMOMMMNLNMMMNLONNOPNQQROPNP	MD:Z:36	RG:Z:2_030810_42YV7AAXX_2	XG:i:0	BI:Z:QQQRPSRRQRORQQPQORQRQRPSSSRSQUTUQRPS	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	MQ:i:0	XT:A:R
ILLUMINA-398FBB:3:97:16471:12631#0	163	chr1	10193	0	36M	=	10419	262	AACCCTAACCCTAACCCTAACCCTAACCCTAACCCT	<<;<?BAA@=ACBBACCDACBCCDACBCCC@@@==A	X0:i:627	BD:Z:OOOPOQOONOMOMMMNLNMMMNMONNOPOQQROPNP	MD:Z:36	RG:Z:2_030810_42YV7AAXX_3	XG:i:0	BI:Z:QQQRPSRRPQORQQPQORQQQRPSRSRSRUUVQRPS	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	MQ:i:0	XT:A:R
ILLUMINA-398FBB:4:5:7890:10614#0	99	chr1	10196	0	36M	=	10397	237	CCTAACCCTAACCCTAACCCTAACCCTAACCCTAAC	<;?032;:A6<=;;@?@??>B?@>A:@==3<>@<?>	X0:i:631	BD:Z:OOPPPPPNOONNNLNNMMNLNNMNOMPPOPRQPPOO	MD:Z:36	RG:Z:2_030810_42YV7AAXX_4	XG:i:0	BI:Z:QQSSRQRORRQPQORRQPQOSSRQSQTTSSUSSSRQ	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	MQ:i:0	XT:A:R
ILLUMINA-398FBB:3:61:17004:12248#0	163	chr1	10213	3	36M	=	10423	246	CCCTAACCCTAACCCTAACCCCTAACCCTAACCCTA	<<<=?A@AA>@AACCDCBBCCCDCCACCDCCAA=CB	X0:i:8	X1:i:21	BD:Z:OONPPPOPMONNMNLNMMMNLLONNNPNQPQRPNPO	MD:Z:36	RG:Z:2_030810_42YV7AAXX_3	XG:i:0	BI:Z:QQPSRRQRORQQPQORQQPQPPSRRRSQUTUURPSR	AM:i:0	NM:i:0	SM:i:0	XM:i:0	XO:i:0	MQ:i:3	XT:A:R
Die gesamte Datei ist 61GB groß und wird in komprimierter Form gespeichert (11GB).
Um die komprimierte Datei zu bearbeiten benutze ich java libraries. Ich kann mir dann die gewünschten Informationen der einzelnen Zeilen aus der Datei heraus holen.
Zunächst möchte ich nur die Gruppe (3.Wert) und die Position (4.Wert).

Zudem ist in jeder Zeile hier 36 Positionen vertreten, ich möchte noch gerne sich wiederholende Positionen zählen. Also wenn in Zeile 2 die Position 10072 in Gruppe chr1 36 Positionen hat dann überlappt sich das mit den Zeilen 3 und 4. Aber die Information bekomme ich über die libs und zwar pro Zeile wird mir dann jede Position die vertreten ist angezeigt, also in dieser Datei eine Schleife von 36 Positionen pro Zeile.

Am Ende möchte ich nur wissen welche Positionen sind in der Datei vertreten und zu den einzelnen Positionen gibt es dann noch Qualitätswerte und zu jeder Zeile gibt es auch einen Qualitätswert die ich speichern möchte.

Ich hoffe das war nicht zu verwirrend.
(Ich habe gestern noch die Verbindung zur Datenbank aufgebaut und in einer bestehenden Verbindung die Werte in die DB eingelesen. Für eine Datei hatte ich 40 min gebraucht, was schon eine Verbesserung war aber immer noch langsam ist.)

Gruß Air
 

Thallius

Top Contributor
Also wenn ich das jetzt richtig verstanden habe, was gar nicht so einfach ist, dann brauchst du eine Tabelle mit

group VARCHAR[10] PRIMARY KEY
position INT PRIMARY KEY
count INT

Damit stellst du sicher, dass du für jede Gruppe/Position Kombination nur einen Eintrag haben kannst und in Count zählst du die Anzahl der Positionen hoch.

Weiterhin brauchst du dann noch eine Tabelle

quality INT
positionid INT
rowid INT

in denen Du die Qualitätswerte speicherst.

Danach kannst Du alle Abfrage stellen die du möchtest. Sprich, Wieivele verschiedene Positionen gibt es, wieviele verschiedene Gruppe, ueige mir alle Qualitätswerte zu Gruppe oder Position etc.

Gruß

Claus
 

aiirtime

Mitglied
Vielen lieben Dank.
Das wäre so zusagen die initiale Datenbank.
Aber das Problem ist immer noch die Zeit.
Also in meinem letzten Versuch habe ich pro Gruppe alle Positionen in Speicher gehalten und dann die Verbindung zur Datenbank erstellt und die Daten hinein geladen.
Es wurden ca. 200000000 Positionen geladen in ca. 40 Minuten.
Kann ich da noch etwas optimieren?

Gruß
Air
 

aiirtime

Mitglied
@Thallius bei den zwei Tabellen fehlt doch noch die Verbindung der rows? Oder erstelle ich da noch eine Tabelle mit
quality INT
rowid INT

und die quality der Position stellt nicht sicher das die quality der richtigen position in der Gruppe zugeordnet wird oder?

Gruß Air
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Sorry habe da noch was vergessen ich Trottel. Die erste Tabelle braucht natürlich noch eine Spalt

id INT AUTOINCREMENT PRIMARY KEY

Die Verknüpfung zur row hast du doch über die zweite Tabelle.

Da es pro Zeile nur eine Position und eine Qualität gibt solltest du noch die beiden Spalten

rowId und positionid mit einem PRIMARY KEY versehen.

Das Einladen kann natürlich länger dauern aber ich würde das auch nicht so machen sondern ich würde immer eine Zeile laden und daraus dann die beiden entsprechenden Einträge in die DB machen. Also einen neuen Eintrag in die erste oder eben den Count der Ersten Tabelle updaten, je nachdem ob es die Gruppen/Position Kombination schon gibt oder nicht. Dann holst du dir die id der erten Tabelle und erzeugst einen neuen Eintrag in der zweiten Tabelle mit der id aus der ersten Tabelle als positionid und der row als rowid. Also zeigt die positionId der zweiten Tabelle immer auf id der ersten Tabelle.

Die Anzahl der Einträge in der ersten Tabelle entspricht dann der Anzahl der verschiedenen Positionen also einfahc

SELECT COUNT(id) FROM tabelle 1

Gruß

Claus
 
Zuletzt bearbeitet:

aiirtime

Mitglied
Ok das war ein wenig zu schnell. Also ich sollte pro zeile mich mit der Datenbank verbinden abfragen was drin ist und dann den Datensatz rein laden? Ist das nicht noch langsamer? Ich werde dann mal rumprobieren.

Bei der row qualität ist das noch nicht ganz richtig. Ich habe pro zeile eine Gruppe und mehre Positionen mit jeweiliger qualität und ein row-qualität. das heißt eine Zeile eine row-qualität mehrere Positionen mehrere pos-qualitäten.
Und bei der id kann ich INT nicht nehmen da ich wahrscheinlich drüber komme. Sollte ich da pro Datei neue Tabellen erstellen? Oder eher eine Datei-id mit führen?

Gruß Air
 

Thallius

Top Contributor
Boah so langsam wird es immer komplizierter :)

Also es gibt pro Zeile eine Gruppe, mehrere Positionen pro Gruppe, eine Qualität pro Position in der gruppe und eine Qualität für die Zeile? Ist die Qualität der Zeile dann nicht irgendwie ein Mittel aus dem anderen Qualitäten?

Solange ich nicht zu 100% weiß wie die Datenstruktur aussieht schmeissen wir die DB Struktur immer wieder um. Das bringt dann leider nichts.
 

aiirtime

Mitglied
Ja genau nur das die row qualität eine andere Aussagekraft hat als das mittel der Position qualitäten.
Hilfreich wäre noch das in den unterschiedlichen Zeilen sich die Positionen wiederholen können und in der gleichen Gruppe mit anderen qualitäten wären. Das würde dann das zählen aufnehmen, aber die Qualitäten müssen nicht gleich sein.
Gruß Air
 
Zuletzt bearbeitet:

Thallius

Top Contributor
So,

also zu 100% ist mir das immer noch nicht klar wie die Daten zusammen hängen aber ich habe leider auch keine Ahnung von Genetik ;)

Trotzdem würde ich es mal folgendermassen machen.

table_group
group_id INT AUTOINCREMENT PRIMARY KEY
group_name VARCHAR[10]
hier kannst du später weitere Spalten anfügen die sich auf eine Gruppe beziehen

table_position
pos_id INT (KEY)
pos_quality INT (BIGINT?) (KEY)
pos_groupid INT (KEY)
pos_count INT (BIGINT?)
hier kannst du später weitere Spalten anfügen die sich auf eine Position beziehen

table_row
row_id INT PRIMARY KEY
row_groupid INT (KEY)
row_quality INT (BIGINT?) (KEY)

Die Keys kannst du erstmal weglassen und später noch hinzufügen wenn Deine Abfragen zu langsam sein sollten.

Das Einlesen machst du dann folgendermassen (Pseudocode)

Java:
DBConnect+Open
while((String row = readNextLine())!=0)
{
    ... hier die Zeile zerlegen und am besten in passende Klassen stecken....
    String groupName = row.GroupName;
    int groupQuality = row.groupQuality;

    SELECT `group_id` FROM table_group WHERE group_name = groupName
    group = fetch()...
    if(!group)
    {
        INSERT INTO table_group (group_name) VALUES (groupName);
        groupId= lastInsert(db);
    }
    else
        groupId=group['group_id'];

     INSERT INTO table_row (row_id, row_groupid, row_quality) VALUES (rowNumber, groupId,rowQuality);

    for(x=0:x<row.positionen.count;x++)
    {
        SELECT `position_id` FROM table_position WHERE pos_id=row.position[x].position AND pos_groupid=groupId
        position = fetch()...
        if(!position)
        {
            INSERT INTO table_position (pos_id, pos_groupid,pos_quality,pos_count) 
                VALUES (row.position[x].position, groupid, row.position[x].quality, 1);
        }
        else
            UPDATE table_position SET pos_count = (pos_count+1) WHERE pos_id = row.position[x].position AND pos_groupid=groupid;
    }
}

Dieses Einlesen wird natürlich erstmal ziemlich lange dauern. Aber das ist ja auch egal da du das nur einmal machen must. Wichtig ist ja nur wie lange es danach dauert die Daten auszulesen und anzuzeigen. Und das sollte dann sehr schnell gehen und wenn nicht dann musst du entsprechend viele KEY einsetzen.

Gruß

Claus
 
Zuletzt bearbeitet:

aiirtime

Mitglied
Wow, danke ich denke das kommt dem sehr nahe was ich bräuchte. Ich werde dann mal herum experimentieren.

Dieses Datenbank Schema wäre dann für eine Datei, da ich ja noch mehrere Dateien einfügen will müsste ich die Datenbank erweitern, was ist dann effizienter eine neue Tabelle mit files oder die Dateien mit in die group-table hinein zunehmen?
Also entweder:
table_file
file_id INT AUTOINCREMENT PRIMARY KEY
group_id INT
file_name VARCHAR[30]
oder:
table_group
group_id INT AUTOINCREMENT PRIMARY KEY
file_name VARCHAR[30]
group_name VARCHAR[10]

Gruß Air
 

Thallius

Top Contributor
Ich würde vielleicht hergehen und einfach die Rows weiterzählen. Dann brauchst du keine neue Tabelle. Wenn du wirklich die exacte Zeilennummer in der Datei brauchst, dann mach halt eine weitere Spalte "Page" in die Tabelle und zähle da die dateien hoch
 

aiirtime

Mitglied
Ok dann nehme ich wohl Page mit rein.
Wenn ich mir gerade die Tabellen anschaue, fehlt da nicht die Verknüpfung? Ich kenne mich mit Datenbanken leider nicht so gut aus aber am Ende möchte ich pro Datei die Positionen haben die z.B. die pos_count > 10, pos_qual > 20 und row_qual > 20 haben.
Müsste da nicht in den jeweiligen tabellen die Verbindung über die id hergestellt werden, damit ich dann die joins aufbauen kann oder wie ordnet die DB das später zu?
ein Beispiel für die spätere Abfrage wäre:
Select group_table.group, pos_table.pos From pos_table join group_table on group_id join row_table on row_id Where group_table.Page="file1"and pos_table.pos_count > 10 and pos_table.pos_qual > 20 and row_table.row_qual > 20;

Gruß Air
 

Thallius

Top Contributor
hmm,

aber die row hat doch mit dem count gar nichts zu tun. denn du kannst ja 5000 positionen mt der gleichen gruppe und qualität in 200 verschiedenen rows haben?

Gruß

Claus
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
D Richtige Kommentierung Klassenvariablen Java Basics - Anfänger-Themen 19
G Die richtige Methode aus einer DTO auszurufen Java Basics - Anfänger-Themen 27
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
I Richtige Java-Version finden? Java Basics - Anfänger-Themen 17
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 1
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 22
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
H Ist Java überhaupt die richtige Sprache für das Projekt? Java Basics - Anfänger-Themen 8
G Lambda Ausdruck: Welche Methode ist die Richtige? Java Basics - Anfänger-Themen 1
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
E Richtige Ausgabe nur mit toString() - Warum? Java Basics - Anfänger-Themen 4
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
K Welche Java Version ist die richtige Java Basics - Anfänger-Themen 3
X Methoden Wort aus String löschen und richtige Verschachtelung Java Basics - Anfänger-Themen 17
X Ist Java für mich das richtige? Java Basics - Anfänger-Themen 10
D Simulation von Geburt/Tod und "richtige" Erkennung eines Hindernisses Java Basics - Anfänger-Themen 7
F In ArrayList wird nicht der richtige Wert gespeichert Java Basics - Anfänger-Themen 6
S Richtige String-Variable finden Java Basics - Anfänger-Themen 3
K Richtige Pfadangabe einer Textdatei Java Basics - Anfänger-Themen 7
P Ist Java die richtige Programmiersprache dafür? Java Basics - Anfänger-Themen 29
Dit_ invokeLater | richtige Anwendung Java Basics - Anfänger-Themen 2
L eine richtige anfänger-frage Java Basics - Anfänger-Themen 3
J FileOutputStream richtige Pfadangabe? Java Basics - Anfänger-Themen 8
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
P Keine richtige Codeabarbeitung?! Java Basics - Anfänger-Themen 9
U Richtige Benutzung der API-Doku Java Basics - Anfänger-Themen 8
G Richtige Syntax für Bruch Java Basics - Anfänger-Themen 12
N Anfängerfrage richtige Syntax und Frage zu Vector Java Basics - Anfänger-Themen 7
G Polymorphismus und die richtige Anwendung Java Basics - Anfänger-Themen 6
B Ist Java das richtige für mich? Java Basics - Anfänger-Themen 12
W Java das richtige? Java Basics - Anfänger-Themen 9
L JTabbedPane, richtige Übergabe von Tabs Java Basics - Anfänger-Themen 18
M Welche Javaversion ist die Richtige? Java Basics - Anfänger-Themen 14
S Java Games Programieren. Der richtige Weg dorthin. Java Basics - Anfänger-Themen 4
M Java die richtige Sprache? Java Basics - Anfänger-Themen 4
S Web Mining - XML Filter der richtige Anstatz? Java Basics - Anfänger-Themen 2
W Java Web Start das richtige? Java Basics - Anfänger-Themen 11
J Richtige Auagabe in einer *.txt Java Basics - Anfänger-Themen 2
B Ist Java das richtige für folgendes Programm! Java Basics - Anfänger-Themen 2
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
M Richtige Paarungen aus Array ausgeben Java Basics - Anfänger-Themen 2
S richtige antworten [%] ausgabe Java Basics - Anfänger-Themen 7
bernd Richtige Pfadangabe für das Kopieren von Dateien Java Basics - Anfänger-Themen 10
A Java wirklich das richtige? Java Basics - Anfänger-Themen 20
B Paar richtige Anfängerfragen Java Basics - Anfänger-Themen 7
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
B Regex Kombination benötigt Java Basics - Anfänger-Themen 5
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Kombination zweier Befehle (Preis festlegen & Rabatt berechnen) Java Basics - Anfänger-Themen 3
H Aus 5 Zahlen eine zufällige Kombination erzeugen,ohne doppel Java Basics - Anfänger-Themen 2
P 3-Tasten-Hotkey-Kombination Java Basics - Anfänger-Themen 5
A if Kombination Java Basics - Anfänger-Themen 4
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 7
F 2x 16bit Werte zu einem 32bit und dann splitten mit 0xb Java Basics - Anfänger-Themen 1
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum sind Werte in den Feldern ? Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
javaBoon86 Arrays 2 Dimension Werte ausgeben Java Basics - Anfänger-Themen 15
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
TeacherMrSSimon Schachspiel, Werte in Figur eintragen klappt nicht Java Basics - Anfänger-Themen 23
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
docmas 2DArray Werte werden nur untereinander ausgegeben Java Basics - Anfänger-Themen 1
M Nur int-Werte erlauben Java Basics - Anfänger-Themen 11
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
Igig1 Wie lasse ich dir Werte in einem Array zusammenrücken? Java Basics - Anfänger-Themen 4
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
H OOP Werte mit Set verändern Java Basics - Anfänger-Themen 6
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
H Welche Werte bei Objekterzeugung eingeben? Java Basics - Anfänger-Themen 2
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
sashady ursprüngliche Array-Werte bei erneutem Aufruf? Java Basics - Anfänger-Themen 7
cmn489 Werte beim Funktionsaufruf in ein Feld übertragen(falls dieses leer ist) Java Basics - Anfänger-Themen 1
E In Array Werte einfügen? Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
L Methoden ArrayList Werte hinzufügen und löschen Java Basics - Anfänger-Themen 32
J Zufallszahlen generieren und Werte vergleichen Java Basics - Anfänger-Themen 3
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
L Werte von Objekte addieren Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben