2010-07-30 5 views
0

J'ai besoin de votre idead pour améliorer notre implémentation.améliorer magasin de données temporaire

nous avons environ 10MB données doivent être traitées dans notre application pour each analysis. ces données sont transférées d'une autre application paquet par paquet. il y a environ 24000 pakcets pour each analysis parce que les données sont créées paquet par paquet dans cette application et nous sont envoyées immédiatement.

notre implémentation actuelle est comme ce qui suit:

communication module reçoit des données et met les données dans un objet (une instance d'une classe de données) lorsqu'un paquet est reçu. Ensuite, il va fire an event qui sera contain that data object.

data process module reçoit l'événement et place l'objet de données reçu dans un arraylist.

Après avoir reçu toutes les données pour une analyse, data process module démarrera le processus de données pour analyser les données. À la fin, les données seront stockées dans la base de données et ces objets de données seront nettoyés pour l'analyse suivante. Le temps entre each analysis est supérieur à 10 minutes.

J'ai supprimé l'opération de clonage ou de copie pendant le processus de transfert de données interne. Donc, je pense que nous sommes en train de passer des références. droite? J'ai également créé un pool pour ces événements et objets de données. donc ces événements et objets de données seront réutilisés encore et encore.

Une autre suggestion est de créer un shared reusable memory space (partage interne, entre modules) pour ces données d'analyse et de transmettre sa référence autour de l'événement. J'aime mieux cette idée mais plus de changement de code de ma part. Ce que j'ai fait maintenant est presque le même en termes d'utilisation de la mémoire. ai-je raison?

Quelle est votre opinion? d'autres meilleures idées? pour la solution shared reusable memory space, quelle est la bonne façon de l'implémenter?

grâce,

+0

Avez-vous fait le profil de l'application? Où étaient les goulots d'étranglement? – Oded

+0

Quelle version de .NET? Combien de threads utilisez-vous ici? –

Répondre

0

Vous pouvez le faire thread-safe en faisant quelque chose comme ça.

public sealed class SafeBytes 
{ 
    private readonly List<byte> _data; 
    private readonly object _lock; 


    public SafeBytes() 
    { 
     _data = new List<byte>(); 
     _lock = new object(); 
    } 


    public void Add(byte[] data) 
    { 
     lock (_lock) 
     { 
      _data.AddRange(data); 
     } 
    } 

    public byte[] ToArray() 
    { 
     lock (_lock) 
     { 
      return _data.ToArray(); 
     } 
    } 
} 
Questions connexes