J'ai besoin de très grande longueur du tableau(de taille) en C#
public double[] result = new double[ ??? ];
Je suis stocker les résultats et le nombre total de résultats sont plus grandes que la de 2 147 483 647 qui est max int32.
J'ai essayé biginteger, ulong etc. mais tous m'a donné des erreurs.
Comment puis-je étendre la taille de la matrice qui permet de stocker > 50,147,483,647 résultats (double) à l'intérieur?
Merci...
Avez-vous vraiment l'373 gigaoctets de mémoire vive?
vous n'avez pas!?
Sonne comme vous avez besoin d'une autre structure de données.
Certainement un XY Problème
si j'ai utiliser beaucoup de fichier de la page, oui 🙂
vous n'avez pas!?
Sonne comme vous avez besoin d'une autre structure de données.
Certainement un XY Problème
si j'ai utiliser beaucoup de fichier de la page, oui 🙂
OriginalL'auteur Atik | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Un tableau de 2,147,483,648
double
s occupera de 16 go de mémoire. Pour certaines personnes, c'est pas une grosse affaire. J'ai des serveurs qui ne fera même pas la peine de frapper le fichier de la page si j'alloue quelques-uns de ces tableaux. Ne veut pas dire que c'est une bonne idée.Si vous êtes aux prises avec d'énormes quantités de données comme que vous devriez être à la recherche à minimiser l'impact de mémoire du processus. Il y a plusieurs façons d'aller avec cela, en fonction de la façon dont vous travaillez avec les données.
Matrices Creuses
Si votre tableau est peu peuplé - beaucoup de défaut/valeurs vides avec un petit pourcentage de réellement valable/données utiles - puis un tableau fragmenté peut considérablement réduire les besoins en mémoire. Vous pouvez écrire les différentes implémentations pour optimiser les différents profils de distribution: distribution aléatoire, groupées des valeurs arbitraires, les groupes contigus, etc.
Fonctionne très bien pour tout type de contenu des données, y compris des classes complexes. A certains frais généraux, de manière peut effectivement être pire que nue tableaux lorsque le pourcentage de remplissage est élevé. Et bien sûr, vous êtes toujours en cours à l'aide de la mémoire pour stocker vos données réelles.
Simple Fichier Plat
Stocker les données sur le disque, créer un de lecture/écriture
FileStream
pour le fichier et placez ce dans un wrapper qui permet d'accéder au contenu du fichier comme si c'était un bloc mémoire. L'implémentation la plus simple de cela vous donnera raisonnable utilité pour des lectures séquentielles à partir du fichier. Lectures et écritures aléatoires peuvent vous ralentir, mais vous pouvez faire un peu de mise en mémoire tampon à l'arrière-plan pour aider à atténuer les problèmes de vitesse.Cette approche fonctionne pour tout type statique de la taille, y compris les structures qui peuvent être copiés à partir d'un éventail d'octets dans le fichier. Ne fonctionne pas pour dynamiquement des données de taille comme des cordes.
Complexe De Fichier Plat
Si vous devez gérer les dynamiques de la taille des dossiers, des données éparses, etc. ensuite, vous pourriez être en mesure de concevoir un format de fichier qui permet de la gérer en toute élégance. Puis de nouveau, une base de données est probablement une meilleure option à ce stade.
Fichier Mappé En Mémoire
Même que les autres options de fichier, mais en utilisant un autre mécanisme d'accès aux données. Voir
System.IO.MemoryMappedFile
pour plus d'informations sur la façon d'utiliser les Fichiers Mappés en Mémoire .NET.Stockage De Base De Données
En fonction de la nature des données, de les stocker dans une base de données peut travailler pour vous. Pour un large éventail de
double
s c'est peu probable d'être une grande option. Les frais généraux de la lecture/écriture des données dans la base de données, plus le stockage des frais généraux - chaque ligne au moins besoin d'avoir une identité de ligne, probablement un BIG_INT (8 octets entier) pour un grand jeu d'enregistrements, le doublement de la taille des données dès le départ. Ajouter dans les frais généraux pour l'indexation, la ligne de stockage, etc. et vous pouvez très facilement multiplier la taille de vos données.Bases de données sont parfaits pour le stockage et la manipulation de données complexes. C'est ce qu'ils sont pour. Si vous avez largeur variable de données des chaînes et de la comme - une base de données est probablement l'une de vos meilleures options. L'envers de la médaille est qu'ils sont généralement pas une solution optimale pour travailler avec de grandes quantités de très simple de données.
Quelle que soit l'option que vous aller avec, vous pouvez créer un
IList<T>
-compatible classe qui encapsule vos données. Cela vous permet d'écrire du code qui n'ont pas besoin de savoir comment les données sont stockées, seulement ce qu'il est.OriginalL'auteur Corey
BCL les tableaux ne peuvent pas le faire.
Quelqu'un a écrit un chunked
BigArray<T>
de la classe qui peut.Cependant, qui ne sera pas comme par magie de créer suffisamment de mémoire.
LongLength
de la propriété.OriginalL'auteur SLaks
Vous ne pouvez pas. Même avec
gcAllowVeryLargeObjects
, la taille maximale d'une dimension dans un tableau (de non-byte
s) est 2,146,435,071De sorte que vous aurez besoin de repenser votre conception, ou utiliser une autre application comme un tableau en escalier.
Je ne sais pas, mais c'est ce qu'elle est: msdn.microsoft.com/en-us/library/hh285054(v=vs. 110).aspx
OriginalL'auteur Marc Gravell
Une autre approche possible est de mettre en place votre propre BigList. Notons d'abord que la Liste est implémenté sous la forme d'un tableau. Aussi, vous pouvez définir la taille initiale de la Liste dans le constructeur, donc si vous savez qu'il sera grand, obtenir un gros morceau de la mémoire à l'avant.
Puis
ou peut-être préférable d'utiliser un a-une approche:
En faisant cela, vous aurez besoin de re-mettre en œuvre l'indexeur de sorte que vous pouvez utiliser de la division et le modulo pour trouver le bon index dans votre magasin de sauvegarde. Ensuite, vous pouvez utiliser un BigInt et l'index. Dans votre personnalisé de l'indexeur vous permettra de décomposer le BigInt en deux format légal ints.
OriginalL'auteur philologon
C# les tableaux sont de taille limitée à
System.Int32.MaxValue
.Pour plus que cela, utilisez
List<T>
(où T est ce que vous voulez à tenir).Plus ici: Quelle est la Taille Maximale d'un Tableau peut contenir?
List<T>
est soutenu par un tableau oui?OriginalL'auteur AllenG