Ich brauche sehr großen array die Länge(Größe) in C#
public double[] result = new double[ ??? ];
Ich bin die Speicherung der Ergebnisse und die Gesamtzahl der Ergebnisse, die größer sind als die 2,147,483,647 die max int32.
Ich habe versucht, biginteger, ulong etc. aber alle von Ihnen gab mir Fehler.
Wie kann ich verlängern Sie die Größe des Arrays speichern können > 50,147,483,647 Ergebnisse (doppelt) drin?
Dank...
Haben Sie wirklich 373 Gigabyte RAM?
Sie nicht!?
Klingt wie Sie brauchen eine andere Struktur der Daten.
Auf jeden Fall ein XY-Problem
wenn ich viel auf der Seite Datei, ja 🙂
Sie nicht!?
Klingt wie Sie brauchen eine andere Struktur der Daten.
Auf jeden Fall ein XY-Problem
wenn ich viel auf der Seite Datei, ja 🙂
InformationsquelleAutor Atik | 2013-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem array von 2.147.483.648 kommt
double
s besetzen 16GB Speicher. Für einige Menschen, das ist keine große Sache. Ich habe Server, die sich nicht einmal die Mühe, Sie zu schlagen, die Seite Datei, wenn ich reservieren, ein paar von diesen arrays. Bedeutet nicht, es ist eine gute Idee.Beim Umgang mit großen Mengen von Daten, wie Sie Sie suchen sollten, um minimieren Sie den Speicherverbrauch des Prozesses. Es gibt mehrere Möglichkeiten, mit diesem zu gehen, je nachdem, wie Sie mit den Daten arbeiten.
Sparse Arrays
Wenn Ihr array ist Dünn besiedelt - viele Standard/leere Werte mit einem geringen Prozentsatz tatsächlich gültige/nutzbare Daten - dann eine sparse-array kann drastisch reduzieren die Anforderungen an den Arbeitsspeicher. Sie können schreiben, verschiedene Implementierungen zu optimieren für verschiedene distribution profile: zufällige Verteilung, gruppierte Werte, willkürliche zusammenhängende Gruppen, etc.
Funktioniert gut für jede Art von Daten enthalten, einschließlich der Klassen, die komplexe. Einige Gemeinkosten, also kann eigentlich schlimmer sein als nackt-arrays, wenn die fill-Anteil ist hoch. Und natürlich bist du immer noch mit den Speicher Ihres tatsächlichen Daten.
Einfache Flat-File -
Speichern der Daten auf der Festplatte, erstellen Sie einen lese/schreib -
FileStream
für die Datei, und schließen Sie in einen wrapper, mit dem Sie Zugriff auf den Inhalt der Datei, als ob es eine in-memory-array. Die einfachste Umsetzung dieses geben Sie mit angemessenem nutzen für die sequentielle liest aus der Datei. Zufällige lese-und Schreibvorgänge können Sie verlangsamen, aber Sie können tun, einige Pufferung in den hintergrund zu verringern, die Geschwindigkeit Probleme.Dieser Ansatz funktioniert für jeden Typ, der hat eine statische Größe, einschließlich der Strukturen, die kopiert werden können/aus einer Reihe von bytes in der Datei. Funktioniert nicht für dynamisch-Größe Daten wie strings.
Komplexe Flat-File -
Wenn Sie behandeln müssen, dynamic-size records, sparse-data, etc. dann könnten Sie in der Lage, einen Datei-format, um Sie zu handhaben aus. Dann wieder, eine Datenbank ist wahrscheinlich eine bessere option zu diesem Zeitpunkt.
Memory-Mapped-Datei
Gleich wie die andere Datei, Optionen, aber mit einem anderen Mechanismus, um den Zugriff auf die Daten. Sehen
System.IO.MemoryMappedFile
weitere Informationen zur Verwendung von Memory-Mapped-Dateien aus .NET.Datenbank-Speicherung
Abhängig von der Art der Daten, der Speicherung in einer Datenbank könnten für Sie arbeiten. Für eine große Reihe von
double
s dies ist wahrscheinlich eine gute option, jedoch. Die Gemeinkosten für das Lesen/schreiben von Daten in die Datenbank sowie die Speicher-Overhead - jede Zeile wird mindestens brauchen, um eine Reihe Identität, wahrscheinlich ein BIG_INT (8-byte-Ganzzahl) für einen großen recordset, die Verdoppelung der Größe der Daten, die rechts von der Fledermaus. Fügen Sie in die Kosten für die Indizierung, Zeile Lagerung, etc. und Sie können ganz einfach multiplizieren Sie die Größe Ihrer Daten.Datenbanken sind ideal für die Speicherung und Manipulation von komplizierten Daten. Das ist, was Sie sind für. Wenn Sie variable-width-Daten - strings und dergleichen - dann eine Datenbank ist wahrscheinlich eine der besten Optionen. Die Kehrseite ist, dass Sie im Allgemeinen nicht eine optimale Lösung für die Arbeit mit großen Mengen von sehr einfachen Daten.
Unabhängig davon, welche option Sie gehen, können Sie eine
IList<T>
-kompatibel-Klasse, kapselt Ihre Daten. Dadurch können Sie code schreiben, muss nicht jeder wissen muss wie die Daten gespeichert sind, nur das, was es ist.InformationsquelleAutor Corey
BCL-arrays, die das nicht tun.
Jemand schrieb eine aufgeteilte
BigArray<T>
Klasse können.Jedoch, dass nicht magisch genug Speicher um es zu speichern.
LongLength
Eigenschaft.InformationsquelleAutor SLaks
Können Sie nicht. Auch mit
gcAllowVeryLargeObjects
, die maximale Größe jeder dimension eines Arrays (nicht-byte
s) ist 2,146,435,071So müssen Sie überdenken Sie Ihre design, oder verwenden Sie eine alternative Implementierung, die wie ein jagged array.
Ich weiß es nicht, aber es ist, was es ist: msdn.microsoft.com/en-us/library/hh285054(v=vs. 110).aspx
InformationsquelleAutor Marc Gravell
Ein weiterer möglicher Ansatz ist die Implementierung eigener BigList. Den ersten Hinweis, die Liste wird implementiert als array. Außerdem können Sie die anfängliche Größe der Liste im Konstruktor, so dass, wenn Sie wissen, es wird groß sein, einen großen Anteil des Speichers vorne.
Dann
oder, vielleicht noch besser, verwenden Sie eine hat-ein Ansatz:
In dies zu tun, werden Sie brauchen, um re-implementieren Sie den indexer, so dass Sie verwenden können, division und modulo zu finden, die richtigen Indizes in Ihre backing-store. Dann können Sie einen BigInt-wie der index. In Ihrem custom indexer-Sie zerlegen die BigInt in zwei rechtliche Größe von ints.
InformationsquelleAutor philologon
C# arrays sind in der Größe begrenzt zu
System.Int32.MaxValue
.Für größer als die, verwenden
List<T>
(wo T ist, was Sie wollen zu halten).Mehr hier: Was ist die Maximale Größe, die ein Array halten kann?
List<T>
wird unterstützt durch ein array ja?InformationsquelleAutor AllenG