Arrays verknüpfen / Datei in RAM / Installation

Hallo!

Ich habe noch ein paar Fragen zu VB.NET:

Ich habe zum Beispiel zwei Arrays bzw. Arraylists. Diese möchte nun logisch verknüpfen. Also bei Array0 = Array1 AND Array2 sollen im Ergebnisarray nur jene Werte stehen, die sowohl im ersten als auch im zweiten Array existieren. Gibt es da schon etwas Fertiges? Und kann man auch andere Verknüpfungen (OR, NOT) realisieren?

Ich habe eine Textdatei mit etwa 45MB. Diese durchlaufe ich zeilenweise (StreamReader.ReadLine()). Ein gesamter Durchlauf mit ein paar Vergleichen dauert etwa 11 Sekunden. Könnte ich die Suchzeit verkürzen, wenn die die Datei in den Arbeitsspeicher einlesen würde?
Wenn ja, wie mache ich das dann am besten? Alles in eine Stringvariable? Kann die überhaupt so große Datenmengen auch aufnehmen und wie kann ich dann die einzelnen Zeilen auslesen? Gibt es andere Möglichkeiten?

Wenn ich mein Programm dann verteilen möchte, muss ja auf dem Zielrechner schon das .NET-Framework 2.0 installiert sein. Welche (frei verfügbare) Installationsprogramme gibt es, die checken können, ob das Framework schon existiert und wenn nicht, es installiert?
Die anderen Installationsaufgaben sind dann eh nicht mehr das Problem. Das wären dann nur mehr ein paar Dateien, die kopiert werden.

mfg
chris

Auch hallo.

Also bei Array0 = Array1 AND
Array2
sollen im Ergebnisarray nur jene Werte stehen, die
sowohl im ersten als auch im zweiten Array existieren. Gibt es
da schon etwas Fertiges?

Man könnte eine etwas umständlichere Lösung realisieren: Array2 wird an Array1 angehängt („append“) und aus dem dann neuen Array0 werden die mehrfachen Einträge dann in ein weiteres neues Array3 geschrieben.
Und nicht gekillt, wie in diesem Snippet: http://dotnet-snippets.de/dns/doppelte-eintraege-aus…

Welche (frei verfügbare) Installationsprogramme gibt es, die
checken können, ob das Framework schon existiert und wenn
nicht, es installiert?

Das kann Windows schon selbst: es gibt eine Fehlermeldung wg. einer fehlenden Softwarekomponente.
Für die Installation braucht man jedenfalls Adminrechte.

mfg M.L.

Hallo!

Hi!

Ich habe noch ein paar Fragen zu VB.NET:

Ich habe zum Beispiel zwei Arrays bzw. Arraylists. Diese
möchte nun logisch verknüpfen. Also bei Array0 = Array1 AND
Array2
sollen im Ergebnisarray nur jene Werte stehen, die
sowohl im ersten als auch im zweiten Array existieren. Gibt es
da schon etwas Fertiges? Und kann man auch andere
Verknüpfungen (OR, NOT) realisieren?

Was soll denn „Array0 = Array1“ bedeuten? Gleichheit, wenn jedes Element gleich ist (sowohl vom Wert her als auch von der Reihenfolge)? Oder reicht auch schon, dass jedes Element nur vorhanden sein muss?
Im zweiten Fall suchst Du letztlich eine Implementierung für eine Menge (engl. Set ). Dazu gibt’s einige Implementierungen im Netz: http://www.google.de/search?hl=de&safe=off&q=vb.net+…
Für den ersten Fall wüsste ich nicht, dass es schon etwas Existierendes gibt, aber die Implementierung ist ziemlich trivial, sobald man mal festgelegt hat, was in diesem Fall z.B. Array0 OR Array1 bedeuten soll (wieder unter Betrachtung der Reihenfolge!).

Ich habe eine Textdatei mit etwa 45MB. Diese durchlaufe ich
zeilenweise (StreamReader.ReadLine()). Ein gesamter
Durchlauf mit ein paar Vergleichen dauert etwa 11 Sekunden.
Könnte ich die Suchzeit verkürzen, wenn die die Datei in den
Arbeitsspeicher einlesen würde?
Wenn ja, wie mache ich das dann am besten? Alles in eine
Stringvariable? Kann die überhaupt so große Datenmengen auch
aufnehmen und wie kann ich dann die einzelnen Zeilen auslesen?
Gibt es andere Möglichkeiten?

Du kannst schon 45MB in einen String einlesen, aber ich glaube nicht, dass sich die Laufzeit nur dadurch, dass Du weniger Leseoperationen hast (dafür aber einen größeren Bereich liest) sehr stark ändert.
Da Du aber auch nicht schreibst, was Du nach dem Einlesen der Datei eigentlich erreichen willst, kann man Dir auch nur schwer helfen.
Wenn der String unbedingt „zeilenweise“ zerlegt werden soll, kannst Du das z.B. per String.Split erreichen. Also in etwa (ich hoffe ich bekomm’ das in VB.NET korrekt hin):

Dim s As String
Dim lines As String()
s = New System.IO.StreamReader("C:\MeineDatei.txt").ReadToEnd()
lines = s.Split(Environment.NewLine)

Wenn ich mein Programm dann verteilen möchte, muss ja auf dem
Zielrechner schon das .NET-Framework 2.0 installiert sein.
Welche (frei verfügbare) Installationsprogramme gibt es, die
checken können, ob das Framework schon existiert und wenn
nicht, es installiert?

Google ist Dein Freund… :smile:
Je nach verwendeter Entwicklungsumgebung ist u.U. schon was mit drin: VisualStudio 2005 bspw. erlaubt Dir, Setup-Projekte zu erstellen, aus denen hinten ein msi-Paket (Windows Installer) rausfällt.

Die anderen Installationsaufgaben sind dann eh nicht mehr das
Problem. Das wären dann nur mehr ein paar Dateien, die kopiert
werden.

mfg
chris

Gruß,
Martin

Hallo!

Ich habe zum Beispiel zwei Arrays bzw. Arraylists. Diese
möchte nun logisch verknüpfen. Also bei Array0 = Array1 AND
Array2
sollen im Ergebnisarray nur jene Werte stehen, die
sowohl im ersten als auch im zweiten Array existieren. Gibt es
da schon etwas Fertiges? Und kann man auch andere
Verknüpfungen (OR, NOT) realisieren?

Was soll denn „Array0 = Array1“ bedeuten?

Das sollte eine Zuweisung sein (array0 = array1 && array2).

Ich habe eine Textdatei mit etwa 45MB. Diese durchlaufe ich
zeilenweise (StreamReader.ReadLine()). Ein gesamter
Durchlauf mit ein paar Vergleichen dauert etwa 11 Sekunden.
Könnte ich die Suchzeit verkürzen, wenn die die Datei in den
Arbeitsspeicher einlesen würde?
Wenn ja, wie mache ich das dann am besten? Alles in eine
Stringvariable? Kann die überhaupt so große Datenmengen auch
aufnehmen und wie kann ich dann die einzelnen Zeilen auslesen?
Gibt es andere Möglichkeiten?

Du kannst schon 45MB in einen String einlesen, aber ich glaube
nicht, dass sich die Laufzeit nur dadurch, dass Du weniger
Leseoperationen hast (dafür aber einen größeren Bereich liest)
sehr stark ändert.
Da Du aber auch nicht schreibst, was Du nach dem Einlesen der
Datei eigentlich erreichen willst, kann man Dir auch nur
schwer helfen.

Das ist eine csv-Datei in der immer im ersten Feld ein Wort steht, nach dem gesucht wird (siehe dazu auch einen Anfrage von mir in ‚Programmierung allgemein‘.

mfg
chris

Hallo!

Ich habe zum Beispiel zwei Arrays bzw. Arraylists. Diese
möchte nun logisch verknüpfen. Also bei Array0 = Array1 AND
Array2
sollen im Ergebnisarray nur jene Werte stehen, die
sowohl im ersten als auch im zweiten Array existieren. Gibt es
da schon etwas Fertiges? Und kann man auch andere
Verknüpfungen (OR, NOT) realisieren?

Was soll denn „Array0 = Array1“ bedeuten?

Das sollte eine Zuweisung sein (array0 = array1 && array2).

:smile: Es war eher so gedacht, dass DU Dir Gedanken machst, was die genaue Bedeutung sein soll (siehe dazu meine Antwort zum Thema).

[…]

Das ist eine csv-Datei in der immer im ersten Feld ein Wort
steht, nach dem gesucht wird (siehe dazu auch einen Anfrage
von mir in ‚Programmierung allgemein‘.

Aha. Hast Du schon die 2 unterschiedlichen Möglichkeiten ausprobiert? Macht es von der Zeit her einen großen Unterschied, ob Du zeilenweise liest oder am Stück und dann mit string.Split zerlegst?

mfg
chris

Gruß,
Martin

Hallo!

Aha. Hast Du schon die 2 unterschiedlichen Möglichkeiten
ausprobiert? Macht es von der Zeit her einen großen
Unterschied, ob Du zeilenweise liest oder am Stück und dann
mit String.Split zerlegst?

Mit der bisherigen Methode dauert die Suche, auch mit mehreren Suchworten, etwa elf Sekunden. Speicherverbrauch des gesamten Programmes ist 30MB.

Das Laden der Datei in eine String-Variable und darauf folgenden Split dauert etwa 9 Sekunden. Zusätzlicher Speicherplatzbedarf über 250MB im RAM. Die Suche in dem Array habe ich dann gar nicht mehr ausprobiert, da mir der Speicherbedarf eindeutig zu viel war.

mfg
chris