2012-07-10 5 views
2

Dans mon programme, je lis une série de fichiers texte à partir du disque. Avec chaque fichier texte, je traite certaines données et stocke les résultats sous forme de JSON sur le disque. Dans ce design, chaque fichier a son propre fichier JSON. En plus de cela, je stocke également certaines des données dans un fichier JSON séparé, qui stocke les données pertinentes à partir de plusieurs fichiers. Mon problème est que le JSON partagé devient de plus en plus grand avec chaque fichier analysé, et utilise par la suite trop de mémoire. Je suis sur une machine 32 bits et j'ai 4 Go de RAM, et je ne peux plus augmenter la taille de la mémoire de la machine virtuelle Java.Mes fichiers JSON sont trop gros pour tenir dans la mémoire, que puis-je faire?

Une autre contrainte à considérer est que je me réfère souvent à l'ancien JSON. Par exemple, disons que je sors ObjX de FileY. Dans le code pseudo, ce qui suit arrive (en utilisant Jackson pour la sérialisation JSON/désérialisation):

// In the main method. 
FileYJSON = parse(FileY); 
ObjX = FileYJSON.get(some_key); 
sharedJSON.add(ObjX); 

// In sharedJSON object 
List objList; 

function add(obj) 
    if (!objList.contains(obj)) 
     objList.add(obj); 

La seule chose que je peux penser à faire est d'utiliser le streaming JSON, mais le problème est que je dois souvent pour accéder au JSON est venu avant, donc je ne sais pas ce flux va fonctionner. Aussi mes types de données sur les chaînes non seulement, ce qui m'empêche d'utiliser les capacités de streaming de Jackson (je crois). Est-ce que quelqu'un sait d'une bonne solution?

+1

Il est peut-être temps de repenser votre structure de données. Trouver un meilleur design (plus modulaire) pourrait faciliter les exigences de la machine. – SJuan76

+0

Obtenez plus de mémoire ou des fichiers plus petits. – duffymo

+0

Si vous stockez toutes vos données en mémoire, le streaming ne vous fera gagner qu'un peu plus de temps. Trouvez des façons de vider ce dont vous n'avez plus besoin. – phatfingers

Répondre

2

Si vous arrivez au point où vos structures de données sont si grandes que vous manquez de mémoire, vous devrez commencer à utiliser autre chose. Je vous recommande d'utiliser une base de données, ce qui accélérera considérablement la récupération et le stockage des données. Il fera également de la limite de votre structure de données la taille de votre disque dur, au lieu de la taille de votre RAM. Essayez une this page pour une introduction à Java et aux bases de données.

1

Je ne peux pas croire que vous avez vraiment besoin de près de 4 Go de RAM seulement pour les fichiers texte et JSON.

Je vois trois solutions possibles.

  1. Passez au texte brut si c'est possible. Ce n'est pas cette mémoire qui a faim.
  2. Il suffit d'ouvrir et de fermer les fichiers lorsque vous en avez besoin. Vous pouvez ordonner les fichiers à une convention de nommage spécifique, comme les deux premiers chiffres de leurs hachages, et les ouvrir comme vous en avez besoin.
  3. Si vous avez tellement de données, vous pourriez peut-être passer à une base de données. Cela permettrait d'économiser beaucoup de ressources.

Je préférerais l'option 3 si c'est possible pour vous.

Questions connexes