Finden, wie viel Erinnerung, die ich zuordnen kann, der für ein array in C#
Ich bin dabei einige Berechnungen erfordern eine große array initialisiert werden. Die maximale Größe des Arrays bestimmt die maximale Größe der ich das problem lösen kann.
Gibt es eine Möglichkeit, programmgesteuert bestimmen, wie viel Speicher verfügbar ist für sagen, die größte array von bytes möglich?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, sich auf ein einzelnes großes array hat eine Reihe von damit verbundenen Probleme - die Fragmentierung des Speichers, zusammenhängende Blöcke, die Begrenzung der maximalen Größe des Objekts, etc. Wenn Sie eine Menge von Daten, würde ich empfehlen, eine Klasse, die simuliert einen große Palette mit vielen kleineren (aber immer noch große) - arrays, die jeweils Feste Größe - also der indexer teilt, um zu finden, die entsprechende array, dann verwendet % um den offset innerhalb des Arrays.
Möchten Sie vielleicht auch, um sicherzustellen, dass Sie auf einem 64-bit OS, mit viel Speicher. Dies wird Ihnen die maximal verfügbare head-Zimmer.
Je nach Szenario, mehr anspruchsvolle algorithmen wie z.B. sparse arrays, eta-Vektoren, usw. von nutzen sein können, zu maximieren, was Sie tun können. Vielleicht sind Sie erstaunt, was die Leute tun könnten, die vor Jahren mit begrenztem Speicher, und nur ein Band spinning rückwärts und vorwärts...
Um sicherzustellen, dass Sie genügend freien Speicher, den Sie verwenden konnte MemoryFailPoint. Wenn der Speicher nicht zugeordnet werden kann, dann ein InsufficientMemoryException erzeugt, was Sie fangen können und sich mit in einer angemessenen Art und Weise.
Die kurze Antwort ist "Nein". Es gibt zwei top-level-Ressourcen werden müssten abgefragt
Als Marc Gravell korrekt angegeben sind, haben Sie Ihre besten Erfolge auf einem 64-bit-Plattform. Hier, jeder Prozess hat eine riesige virtuelle Adressraum. Dies wird effektiv lösen Ihre erste problem. Sie sollten auch sicherstellen, dass die Auslagerungsdatei ist groß.
Aber, es gibt einen besseren Weg, die ist nur begrenzt durch den Speicherplatz auf dem Datenträger: memory-mapped-Dateien. Sie können eine große mapping (sprich 512MB) in eine beliebig große Datei und verschieben Sie Sie, wie Sie Ihre Daten verarbeiten. Beachten Sie, sicher sein, um es zu öffnen, die für exklusiven Zugriff.
Wenn Sie wirklich brauchen, wirklich großen arrays, nicht mit der CLR. Mono unterstützt 64-bit array-Indizes, so dass Sie in vollem Umfang nutzen Ihre Speicher-Ressourcen.
Ich vermute, binäre Suche, könnte ein Weg zu gehen. Starten Sie zunächst durch die Zuteilung von 1 byte, wenn das gelingt, freie byte (legen Sie das Objekt auf null), und doppelklicken Sie auf 2 bytes. Gehen Sie auf, bis Sie Sie nicht mehr zuordnen, und Sie gefunden haben, eine Grenze, die Sie betrachten können, "die untere Grenze".
Die richtige Anzahl von bytes, die reserviert werden können (nennen wir es x) ist innerhalb des Intervalls unteren < x < 2 * unteren. Weiterhin auf der Suche, dieses Intervall unter Verwendung der binären Suche.
Das größte array kann man zuordnen in einer 64-bit .NET-Programm liegt bei 2 GB. (Eine andere Referenz.)
Könnten Sie herausfinden, wie viele bytes es gibt einfach genug:
Gegeben, dass die Informationen, die Sie sollten in der Lage sein, Ihre Entscheidung zu treffen.