2009-09-16 12 views
0

Je travaille sur un outil d'analyse qui lit les résultats d'un processus et les convertit continuellement en un format interne. Une fois la "phase d'enregistrement" terminée, l'analyse est effectuée sur les données. Les données sont toutes conservées en mémoire. Cependant, étant donné que toutes les informations consignées sont conservées en mémoire, il existe une limite à la durée de la journalisation. Pour la plupart des cas d'utilisation, c'est correct, mais il devrait être possible de courir plus longtemps, même si cela nuira aux performances.Paging à la demande pour permettre l'analyse de grandes quantités de données

Idéalement, le programme devrait pouvoir commencer à utiliser l'espace du disque dur en plus de la RAM une fois que l'utilisation de la RAM atteint une certaine limite.

Cela conduit à ma question: Existe-t-il des solutions existantes pour cela? Il doit fonctionner à la fois sur Unix et Windows.

Répondre

0

Sans en savoir plus sur votre application, il n'est pas possible de fournir une réponse parfaite. Cependant, cela sonne un peu comme si vous réinventiez la roue. Avez-vous envisagé d'utiliser une bibliothèque de base de données in-process telle que sqlite?

Si vous avez utilisé cela ou similaire, il prendra soin de déplacer les données vers et depuis le disque et la mémoire et vous donner des capacités de requêtes SQL puissantes en même temps. Même si vos données de journalisation sont dans un format personnalisé si chaque élément possède une clé ou un index quelconque, une petite base de données légère peut convenir.

+0

J'ai envisagé d'utiliser SQLite, mais cela nécessiterait la réécriture de grandes parties de l'application. Comme il s'agit d'un cas d'utilisation assez rare, je préférerais pouvoir utiliser simplement un fichier sur disque si nécessaire. – beta

0

Pour utiliser le disque une fois la mémoire pleine, nous utilisons les technologies de cache telles que EhCache. Ils peuvent être configurés avec la quantité de mémoire à utiliser et déborder sur le disque.

Mais ils ont aussi des algorithmes plus intelligents que vous pouvez configurer au besoin, comme l'envoi de données disque non utilisées dans les 10 dernières minutes etc ... Cela pourrait être un plus pour vous.

0

Cela peut sembler trop évident, mais qu'en est-il des fichiers mappés en mémoire? Cela fait ce que vous voulez et permet même à une application 32 bits d'utiliser plus de 4 Go de mémoire. Le principe est simple, vous allouez la mémoire dont vous avez besoin (sur le disque) et ensuite mappez juste une partie de celle-ci dans la mémoire système. Vous pouvez, par exemple, mapper quelque chose comme 75% de la taille de mémoire physique disponible. Ensuite, travaillez dessus, et quand vous avez besoin d'une autre partie des données, réalisez simplement une nouvelle cartographie. L'inconvénient de ceci est que vous devez faire la cartographie manuellement, mais ce n'est pas nécessairement mauvais. La bonne chose est que vous pouvez utiliser plus de données que ce qui entre dans la mémoire physique et dans la limite de mémoire par processus. Cela fonctionne vraiment bien si vous n'utilisez réellement qu'une partie des données à un moment donné.

Il peut y avoir des bibliothèques qui le font automatiquement, comme celle suggérée par KLE (bien que je ne le sache pas). Le faire manuellement signifie que vous en apprendrez beaucoup et que vous aurez plus de contrôle, bien que je préfère une bibliothèque si elle fait exactement ce que vous voulez en ce qui concerne comment et quand le disque est utilisé.

Cela fonctionne de manière similaire sur Windows sous Unix. Pour Windows, voici un article by Raymond Chen qui montre un exemple simple.

+0

Cela fonctionnerait, mais ce sera très compliqué si j'ai 20 Go de données dans un fichier et que j'ai besoin de regarder les données au début, au milieu et à la fin du fichier. Si ma compréhension est correcte, cela signifiera que je dois convertir des parties du fichier et faire beaucoup de comptabilité, en écrivant essentiellement mon propre gestionnaire de mémoire. – beta

+0

C'est vrai. L'accès aléatoire rend cette chose plus compliquée.Vous auriez essentiellement les mêmes choses à faire que le système d'exploitation quand il échange. Votre avantage pourrait être que vous savez à l'avance quelles sections vous devez cartographier. Cependant, si vous voulez travailler sur plus de données que dans l'espace d'adressage virtuel, vous devez faire quelque chose comme ça de toute façon. Si vous ne voulez pas faire cela, vous pouvez toujours essayer de trouver une bibliothèque qui le fait. Vous pouvez également essayer de fonctionner sur un fichier réel, en vous appuyant sur le mécanisme de mise en cache du système de fichiers du système d'exploitation pour les performances. – OregonGhost