Besoin d'aide ! Je ne peux pas résoudre le problème, je me heurte à des limitations matérielles.

 

Il y a une grande quantité d'informations (environ 20 Go dans un fichier texte).

Les informations sont constituées du même type de séquences, environ un million.

Il est nécessaire de parcourir toutes les séquencesà plusieurs reprises et de faire quelques calculs.

La première chose qui vient à l'esprit est de lire tout le contenu du fichier, de le remplir dans le tableau de structures et de travailler avec lui en mémoire.

Mais cela n'a pas fonctionné, au prochain redimensionnement MT jure "Memory handler : cannot allocate 5610000 bytes of memory".

Manager montre que terminal.exe utilise 3,5 Go de mémoire (sur 16 physiques). Je suppose que c'est parce que le processus ne peut obtenir que 4 Go.

Avant de commencer

Lire 2 %.

Lire 6 %.

Lire 12%.

Lire 15 %.

Tout le monde...

EA dit "Pas assez de mémoire(4007 Mb utilisés, 88 Mb disponibles, 4095 Mb au total) !!!".

Et cela ne représente que 15,3 % du montant requis (et j'aimerais l'augmenter à l'avenir également).


Option 2 - lire chaque fois le fichier. Trouvez le morceau nécessaire, enregistrez-le dans la structure, lisez le morceau suivant, comparez le résultat, écrasez la structure.

Et si je devais revivre ces séquences une fois, c'est ce que je ferais. Mais vous devez les parcourir plusieurs fois, en avançant un peu à chaque fois.

Donc tu dois lire beaucoup de fois, ce qui est :

  • très, très lent.
  • Essuyer un trou dans la vis.
Je ne suis pas sûr d'être prêt à attendre quelques jours pour les résultats...

C'est aussi frustrant de voir combien d'informations il y a... S'il s'agissait de 10 GiG, je le déplacerais sur le disque RAM (en fait, dans la mémoire) et je lirais autant que je peux. Oui ?

C'est tout ce à quoi je peux penser.

Essayez de recompiler ces séquences, de manière à ce qu'il y ait beaucoup de pièces, mais chacune ne contenant que les informations nécessaires au moment présent ?

Essayez aussi de compresser les données (j'ai déjà converti en flottants avec des types char partout où je le pouvais) ? Mais cela me donnera 10%-20% de plus au maximum, et je dois réduire le volume d'un ordre de grandeur...

Des conseils, mes amis ? Je vais le chercher.)

 

komposter:

Des conseils, mes amis ? Je m'en occupe.)

Comme options...

1. faites votre propre cache. Dans ce cas, vous contrôlez ce qui est en mémoire. Vous connaissez l'algorithme, donc vous pouvez rendre le cache efficace.

2. utilisez le mappage pour le fichier. Wind mettra en cache ce dont il a besoin et n'effacera pas le disque dur.

 
TheXpert:

Comme options...

1. créer votre propre cache. Dans ce cas, vous pourrez gérer vous-même tout le contenu.

2. utiliser le mappage pour le fichier. vin lui-même mettra en cache ce dont il a besoin, afin de ne pas écraser le disque.

1. C'est le cache... Ou je ne comprends pas ce que vous voulez dire. Mon option de lire constamment les morceaux nécessaires ?

2. Pouvez-vous nous en dire un peu plus ? Que va faire la cartographie et comment l'aborder ?

 
Je commence à m'habituer à la cartographie. Je vais étudier plus de mana et ensuite aller aux mines.)
 

Oh, merde...

32-битные архитектуры (Intel 386, ARM 9) не могут создавать отображения длиной более 4 Гб

Les mêmes œufs, mais de côté. La lecture peut s'accélérer, mais elle ne résout pas le problème de manière globale.

 

Une autre idée est de tout transférer dans une base de données (MySQL ?) et de travailler avec elle. L'idée est que les bases de données sont conçues pour de tels volumes et des fouilles constantes.

Y a-t-il des experts ? Qui a une opinion ?

 

1) Y a-t-il un moyen de refaire l'algorithme ? Pour charger un bloc (2GB), le traiter, sauvegarder le résultat (plus court), libérer la mémoire, charger le bloc suivant ...

et à la fin, traiter tous les résultats à nouveau.

2) Lorsqu'il y a beaucoup de travail avec la mémoire, les solutions basées sur le hachage, les B-trees (et leurs modifications), le déchargement vers la base de données sont associés.

 
ALXIMIKS:

1) Y a-t-il un moyen de refaire l'algorithme ? Pour charger un bloc (2GB), le traiter, sauvegarder le résultat (plus court), libérer la mémoire, charger le bloc suivant ...

et à la fin, traiter tous les résultats à nouveau.

2) Lorsqu'il y a beaucoup de travail avec la mémoire, les solutions basées sur le hachage, les B-trees (et leurs modifications), le déchargement vers la base de données sont associés.

1. j'ai écrit à ce sujet - vous pouvez le faire, mais le problème est que vous devez traiter les données plusieurs fois. Ce sera très lent.

2. Demain, je me googliserai, je serai reconnaissant pour une courte description.

 
komposter:

1. j'ai écrit à ce sujet - vous pouvez le faire, mais le problème est que vous devez traiter les données plusieurs fois. Ce serait très lent.

2. Demain, je vais me googliser, je vous serais reconnaissant de me donner une brève description.

Je me suis souvenu d'un site où un problème similaire et des variantes de sa solution en C++ étaient discutés.

Отсортировать строки в файле размером 3GB | FulcrumWeb
Отсортировать строки в файле размером 3GB | FulcrumWeb
  • www.fulcrumweb.com.ua
Необходимо написать алгоритм, который бы смог отсортировать строки в файле большого размера (от 2-х до 4-х Gigabytes). Результатом выполнения должен быть другой файл. За хорошую реализацию гарантированный приз – флешка для хранения таких файлов и, возможно, предложение работы в нашей компании.
 
Je suis désolé mais que se passe-t-il si vous essayez le 64 bits ou si mt ne fonctionne qu'en 32.
Je pensais naïvement qu'une chose aussi hautement mathématique devait fonctionner sur 64 bits.
Prenez les calculs aérodynamiques pour les avions, ils ne fonctionnent pas du tout sur 32x.
pour ce qui est de l'argument de base selon lequel le 32x est plus rapide pour faire tourner la machine, je sais mais c'est vraiment un problème de matériel, je pense.
 

1. Naturellement, utilisez un système x64.

2. louer une machine plus puissante dans le nuage Amazon EC2 et effectuer les calculs sur celle-ci.

3. utiliser des données compressées, décompresser en mémoire à la volée. Les données réelles sont mieux compressées si vous les divisez en flux (signe/mantisse/exposant) ; vous pouvez utiliser des flottants 12 bits (au détriment de la précision).

4. faire un calcul hors conseiller avec quelque chose qui peut gérer de grosses données (Matlab/R/etc).

Raison: