J'essaie de faire migrer une base de données où les images étaient stockées dans la base de données vers un enregistrement de la base de données pointant vers un fichier sur le disque dur. J'ai essayé d'utiliser Parallel.ForEach
pour accélérer le processus en utilisant cette méthode pour interroger les données.
Cependant, j'ai remarqué que je recevais un OutOfMemory
Exception. Je sais Parallel.ForEach
interrogera un lot d'énumérables pour atténuer le coût de l'overhead s'il y en a un pour espacer les requêtes (ainsi votre source aura plus probablement l'enregistrement suivant en mémoire cache si vous faites un tas de requêtes en une fois au lieu de les espacer). Le problème est dû au fait que l'un des enregistrements que je renvoie est un tableau d'octets de 1 à 4 Mo et que la mise en cache entraîne l'utilisation de tout l'espace d'adressage (le programme doit être exécuté en mode x86 car la plate-forme cible sera une machine 32 bits).
Existe-t-il un moyen de désactiver la mise en cache ou de la réduire pour le TPL ?
Voici un exemple de programme pour montrer le problème. Il doit être compilé en mode x86 pour montrer le problème si cela prend trop de temps ou ne se produit pas sur votre machine, augmentez la taille du tableau (j'ai trouvé 1 << 20
prend environ 30 secondes sur ma machine et 4 << 20
était presque instantanée)
class Program
{
static void Main(string[] args)
{
Parallel.ForEach(CreateData(), (data) =>
{
data[0] = 1;
});
}
static IEnumerable<byte[]> CreateData()
{
while (true)
{
yield return new byte[1 << 20]; //1Mb array
}
}
}
0 votes
Combien de fils sont actifs pendant l'exécution de ce programme ? Est-ce que le fait de fixer un
ParallelOptions.MaxDegreeOfParallelism
aide à la valeur ?0 votes
Kevin Pullin Il y avait 9 tâches en cours d'exécution avec le code d'exemple au moment de l'exception (je l'exécute sur un quadruple cœur). En fixant le maximum à 2 et la taille du tableau à 4Mb, il se stabilise à un ensemble de travail d'environ 64Mb. Je ne suis pas sûr que ce soit le cas. Je pense que faire cela ou ne pas utiliser TPL pourrait être ma seule option. Je vais laisser le système fonctionner toute la nuit avec ces paramètres et voir si l'exception persiste.