WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Allgemeines zur Benutzung sehr großer Arrays

 

flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 00:16     Titel: Re: Brauche große Matrix Fehler Maximum variable size allow
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

Der Vorschlag, dies in C++ zu implementieren, wird nicht helfen, da auch dann genau der gleiche Speicherplatz benötigt wird. Zwar ist es möglich die Matrix in C++ als einzelne Vektoren zu speichern, so dass der benötigte Speicher zumindest nicht zusammenhängend sein muss. Das ist in Matlab aber genauso möglich, z.B. als CELL, welches die einzelnen Vektoren enthält.


Ich befasse mich zurzeit mit der Verarbeitung von solchen Datenmengen. Weiterhin ist Deine Aussage nicht korrekt, ich kann auch mehr als meinen aktuellen RAM adressieren, bzw. das OS lagert über entsprechendes Swapping-Machanismen ( http://de.wikipedia.org/wiki/Swapping ) die Daten aus, d.h. wenn ich die Matrix nicht vollständig im Speicher halte, sondern nur Chunks benötige, kann ich solche Daten auch verarbeiten.
Da Matlab aber Javabasiert arbeitet, liegt natürlich die Speicherverwaltung und -adressierung bei der JRE. Bei entsprechender Chunkbildung muss man sich in den meisten Fällen um das Laden selbst kümmern. Wir haben einige Zeit lang versucht solche Datenmengen sinnvoll in Matlab zu Verarbeiten und leider haben wir keine praktikable Lösung entwickeln können. Deshalb mein Hinweis, dass man mit anderen System durchaus eine funktionsfähige Lösung entwerfen kann.

Ich kann in C++ durchaus solche Distanzmatrizen verarbeiten und auch im Speicher halten. Ich nutze hier in meinem Fall MPI, so dass ich über mehrere Knoten die Distanzmatrix verteile (Chunks). Durch die Adressierung wird mit Hilfe der Hardware Sorge getragen, dass die notwendigen Speicherbereiche sehr schnell z.B. über Infiniband (und DMA) auf die anderen Nodes übertragen werden können. Damit kann dann jeder Knoten entsprechend arbeiten und tauscht bei Bedarf die Daten aus. Somit ist die Größe der Matrix nur durch die Summe des im Cluster zur Verfügung stehenden Speichers (RAM + SWAP) begrenzt und diesen kann ich bei Bedarf erweitern. Mit steht z.B. pro Node 64 GB als RAM zur Verfügung.

Diese Distanzmatrizen ergeben sich z.B. bei der Analyse von Texten, Genomsequenzierung, Webgraphen o.ä. wobei eben nicht nur die Matrix ein Problem darstellt, sondern auch die zugrunde liegenden Daten. Da Distanzmatrizen quadratische Matrizen sind, wächst die Größe entsprechend quadratisch zu den Eingabedaten, selbst wenn man davon ausgeht, dass die Matrix symmetrisch ist, lässt sich eine solche Datenmenge nicht ohne zusätzliche Algorithmik zur Verarbeitung / Speicherung verarbeiten
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2012, 08:55     Titel:
  Antworten mit Zitat      
Hallo flashpixx,

auf MATLAB basierend gibt es die Parallel Computing Toolbox, mit Hilfe derer man Anwendungungen und auch Daten auf mehrere Kerne, die auch auf verschiedenen Rechnern liegen können, verteilen kann. Die Kommunikation wird dabei, soweit nötig, automatisch übernommen.
http://www.mathworks.de/products/parallel-computing/

Es ist zwar korrekt, dass durch Swapping größere Datenmengen erzeugt werden können als in den Hauptspeicher passen; die Anwendungen werden dabei aber häufig extrem ausgebremst, ich würde das also mit Vorsicht anwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 10:54     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

auf MATLAB basierend gibt es die Parallel Computing Toolbox, mit Hilfe derer man Anwendungungen und auch Daten auf mehrere Kerne, die auch auf verschiedenen Rechnern liegen können, verteilen kann. Die Kommunikation wird dabei, soweit nötig, automatisch übernommen.
http://www.mathworks.de/products/parallel-computing/


Das ist richtig, mit Matlab-Standard Dingen aber so nicht möglich. Zusätzlich sehe ich persönlich nicht die Notwendigkeit dieser Toolbox, weil sie auf Technologien wie http://de.wikipedia.org/wiki/Message_Passing_Interface , http://de.wikipedia.org/wiki/CUDA , http://de.wikipedia.org/wiki/OpenCL und http://de.wikipedia.org/wiki/Openmp basiert, somit kann ich ohne die Toolbox z.B. in C++ diese Funktionalität auch selbst implementieren. Die numerischen Strukturen werden mir durch die Boost, LAPack und ARPack bzw PetSc auch sehr leicht zur Verfügung gestellt.

Wie ich auch schon mehrfach geschrieben hatte, dies soll keine Aussage gegen Matlab sein. Für Proof-of-Concept (z.B. im Bereich Rapid Prototyping) halte ich Matlab für ein unverzichtbares Werkzeug, aber man muss auch die Grenzen dieses Werkzeugs kennen


Harald hat Folgendes geschrieben:

Es ist zwar korrekt, dass durch Swapping größere Datenmengen erzeugt werden können als in den Hauptspeicher passen; die Anwendungen werden dabei aber häufig extrem ausgebremst, ich würde das also mit Vorsicht anwenden.


Ja leider, Swapping macht hier (auch in jeder anderen Sprache) vieles in der Performance schlecht. Meistens liegt die Lösung des Problems in einer Anpassung des Verfahrens, so dass nur noch Teile der Matrix überhaupt benötigt werden (meist unter dem Begriff "Patch" zu finden) und wie ich es beschrieben habe, durch Verteilung der Daten (Chunkbildung). Leider ziehen Patch-Verfahren oft auch eine Approximation mit sich, so dass diese dann auch zu beachten sind.

Bezüglich Matlab muss ich allerdings sagen, dass man bei gleichen Daten und gleichem Algorithmus deutlich weniger Speicher benötigt und die Performance höher ist. Ich denke zwar, dass viele positiven Dinge, die Matlab mitbringt einem zwar viel Arbeit abnehmen, bei solchen Datenmengen die entsprechenden Codestrukturen und Algorithmen angepasst werden müssen. C++ bietet letztendlich mit den UBlas Strukturen der Boost, Atlas und LAPack / ARPack mindestens den gleichen Funktionsumfang (Matlab verwendet diese Bibliotheken selbst), wobei ich aber in C++ direkt auf den Speicher zugreifen kann. Zusätzlich kommt in Matlab negativ die Garbage Collector Eigenschaft von Java hinzu, nämlich dass nicht deterministisch fest gelegt wird, wann und ob ein Destruktor eines Objektes aufgerufen wird, d.h. Objekte die im Backend durch Java angelegt wurden, existieren noch eine Zeit lang im RAM, was bei solchen Datenmengen durchaus problematisch ist. Bei C++ wird der Speicher spätestens, wenn das Objekt out-of-scope geht durch den Destruktor wieder frei gegeben (bzw. beim manuellen delete-Aufruf).
Da ebenfalls in Java alle Datenstrukturen als Objekte behandelt werden, letztendlich auch via JNI eingebundene externe Datenstrukturen (bei JNI muss mindestens ein statischer Methodencall in einer Klasse existieren) hat man immer den Objekt-Overhead im Speicher.

Ich denke, dass bei diesen Datenmengen man entweder vollständig nach C++ portiert ggf. dann die Berechnung in C++ macht oder nur Teildaten, die benötigt werden via Mex in Matlab überträgt, d.h. erzeugen einer externen Bibliothek und diese dann mit Mex in Matlab einbindet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.06.2012, 15:39     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Zusätzlich sehe ich persönlich nicht die Notwendigkeit dieser Toolbox, weil sie auf Technologien wie [...] basiert, somit kann ich ohne die Toolbox z.B. in C++ diese Funktionalität auch selbst implementieren. Die numerischen Strukturen werden mir durch die Boost, LAPack und ARPack bzw PetSc auch sehr leicht zur Verfügung gestellt.


Grundsätzlich könnte man sich die Funktionalität von Toolboxen natürlich oft auch selbst programmieren. Die Toolbox liefert halt fertige und gründlich getestete Funktionalität, die gerade im Fall der Parallel Computing Toolbox auch für Leute ohne große Programmiererfahrung leicht verwendbar ist.

Zitat:
Ich denke zwar, dass viele positiven Dinge, die Matlab mitbringt einem zwar viel Arbeit abnehmen...

Das sehe ich auch so. Selbst wenn man die notwendigen programmiertechnischen Fähigkeiten hat, um das von dir anschließend beschriebene umzusetzen, kann ich mir vorstellen, dass das Programmieren so erheblich länger dauert als mit MATLAB.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 15:57     Titel:
  Antworten mit Zitat      
@Harald: Da stimme ich definitiv bei allen Punkten zu
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.06.2012, 16:22     Titel: Re: Brauche große Matrix Fehler Maximum variable size allow
  Antworten mit Zitat      
Hallo flashpixx,

Ich habe keinen Zweifel, dass Du auch so große Datenmengen per MPI über einen Rechner-Cluster verarbeiten kannst. Eine andere Lösung, die durchaus effizient wäre, wäre der Kauf einer Maschine mit 320 GB RAM, was heutzutage nicht schwierig ist.
Nur bringen solche Lösungen für hacke78 gar nichts, denn er beschreibt, dass er einen 2GB WinXP-Rechner verwendet. Da ich davon ausgehe, dass dies ein 32 Bit Rechner ist (hacke78, bitte korrigiere mich), wird er auch unter C++ Schwierigkeiten haben, ein 28 GB-Array ohne grobe Verrenkungen zu adressieren. Damit wird auch die Geschwindigkeit des Swappens auf die Platte für die Praxis irrelevant.

Ich halte eine theoretische Diskussion darüber, wie man das Problem lösen könnte, wenn man ganz andere Mittel zur Verfügung hätte, für wissenschaftlich interessant. Ich meine aber, dass man in einem Forum nicht vergessen sollte, dass die Fragenden gerne ihre Probleme lösen möchten. Die Diskussion über MPI gesteuerte Cluster wäre sinnvoll, wenn gefragt worden wäre: "Ich möchte eine Maschine kaufen, die eine 60'000x60'000 Matrix in sinnvoller Zeit verwenden kann und ich habe X*1e4 Euro".

Zitat:
Da Matlab aber Javabasiert arbeitet, liegt natürlich die Speicherverwaltung und -adressierung bei der JRE.

Während Matlab's GUI Java-basiert ist, trifft das für den Kernel nicht zu. So kann man Matlab auch ohne JVM laufen lassen, wenn man bei den GUIs Abstriche macht. Hast Du eine Quelle für die JRE-basierte Speicher-Adressierung?

Bitte führe Diskussionen über allgemeine Computer- oder Matlabfragen in einem neuen Thread. Dieser Thread gehört hacke78 und es wäre hilfreich, wenn alle beim Thema bleiben. Danke!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2012, 16:37     Titel: Re: Brauche große Matrix Fehler Maximum variable size allow
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

Ich halte eine theoretische Diskussion darüber, wie man das Problem lösen könnte, wenn man ganz andere Mittel zur Verfügung hätte, für wissenschaftlich interessant. Ich meine aber, dass man in einem Forum nicht vergessen sollte, dass die Fragenden gerne ihre Probleme lösen möchten. Die Diskussion über MPI gesteuerte Cluster wäre sinnvoll, wenn gefragt worden wäre: "Ich möchte eine Maschine kaufen, die ein 60'000x60'000 Matrix in sinnvoller Zeit verwenden kann und ich habe X*1e4 Euro".


Die Lösung ist letztendlich das ganze auf einen Cluster zu verteilen oder wie schon gesagt den Algorithmus dahin gehend zu verändern, dass er die Distanzmatrix als Dekomposition betrachtet, was aber mit einer Verteilung der Daten einher geht wie z.B. die genannte Patch / Chunkbildung. Eine Adressierung von dieser Datenmenge ist so nicht möglich. Lösungen sind dann eben clusterbasierte Ansätze, wobei wir dann letztendlich bei meinem ursprünglichen Hinweis wären, somit liegt die Lösung eben leider darin entweder die Hardware und/oder den Algorithmus zu verändern.

Jan S hat Folgendes geschrieben:

Während Matlab's GUI Java-basiert ist, trifft das für den Kernel nicht zu. So kann man Matlab auch ohne JVM laufen lassen, wenn man bei den GUIs Abstriche macht. Hast Du eine Quelle für die JRE-basierte Speicher-Adressierung?


Ich hatte vom Mathworks Support selbst diese Aussage erhalten, dass letztendlich alle Datenstrukturen als Javaobjekte ggf mit JNI verbunden intern gehalten werden. Ich hatte bezüglich des Destruktor Aufrufes diese Frage gestellt, wann Matlab intern eine Speicherbereinigung durchführt und wurde auf den generellen GC von Java verwiesen. Ich hatte bezüglich großer Matrizen das Problem, dass ich wissen wollte ob der Destruktor deterministisch wie bei C++ oder indeterministisch wie bei Java aufgerufen wird. Seit dem ich meinen Matlab analog wie Javacode sehe, habe ich praktisch weniger Speicherprobleme. Ob dies nun 100%ig korrekt ist, habe ich im Detail nicht nachgeprüft
Private Nachricht senden Benutzer-Profile anzeigen
Gesplittet: 29.06.2012, 17:20 Uhr von Jan S
Von Beitrag Brauche große Matrix Fehler Maximum variable size allowed.. aus dem Forum Matlab intern
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.06.2012, 17:45     Titel: Re: Brauche große Matrix Fehler Maximum variable size allow
  Antworten mit Zitat      
Hallo flashpixx,

[quote]Ich hatte vom Mathworks Support selbst diese Aussage erhalten, dass letztendlich alle Datenstrukturen als Javaobjekte ggf mit JNI verbunden intern gehalten werden.[/code]
Das ist verblüffend. Es würde mich sehr wundern. wenn TMW den jahrelang getesteten Memory-Manager aus der Pre-Java Zeit in den Ruhestand geschickt hätte.
Tiefe Klarheit wird hier wohl nur jemand vom Technischen Support schaffen können.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.