2009-07-29 8 views
1

J'ai des fichiers volumineux (de plusieurs gigaoctets à des centaines de gigaoctets) que je cherche et essaye de trouver chaque occurrence d'une chaîne donnée.Lors d'une recherche parallèle, quand la bande passante de la mémoire deviendra-t-elle le facteur limitant?

J'ai cherché à faire fonctionner ceci en parallèle et j'ai quelques questions.

  1. Comment est-ce que je devrais faire ceci? Je ne peux pas copier le fichier entier en mémoire car c'est trop gros. Est-ce que plusieurs pointeurs FILE * fonctionneront?

  2. Combien de threads puis-je mettre sur le fichier avant que la bande passante du disque ne devienne un facteur limitant, plutôt que le processeur? Comment puis-je contourner cela?

Actuellement, ce que je pensais est j'utiliser 4 fils, tâche chacun avec un FILE * soit à 0%, 25%, 50%, et ainsi de 75% à travers le dossier et de chaque sauvegarde son résultats à un fichier ou une mémoire, puis collecter les résultats dans une dernière étape. Bien qu'avec cette approche, en fonction de la bande passante, je pourrais facilement ajouter plus de threads et éventuellement obtenir une plus grande accélération.

Qu'en pensez-vous?

EDIT: Quand j'ai dit la bande passante de la mémoire, j'ai réellement signifié l'E/S de disque. Désolé pour ça.

+2

Vous devez disposer de disques durs rapides si le goulot d'étranglement n'est pas dans les E/S disque. – balpha

+0

Mes pensées exactement :) –

+0

La bande passante (E/S ou mémoire) deviendra un goulot d'étranglement lorsque le matériel ne peut pas suivre. Quel genre de dépend du * matériel *. Envoyez-moi votre ordinateur et je le testerai pour vous. Ou vous pouvez l'essayer vous-même sur votre propre système, puisque c'est le seul moyen d'obtenir un résultat fiable. Il n'y a pas de réponse générale. – jalf

Répondre

6

Avec cette nouvelle version révisée de la question, la réponse est "presque immédiatement". Les disques durs ne sont pas très bons pour lire à partir de deux endroits sur le disque en même temps. :) Si vous aviez plusieurs disques durs et que vous partagiez votre fichier entre eux, vous pourriez probablement profiter de certains threads. Pour être juste, cependant, je dirais que la vitesse du disque est déjà le facteur limitant. Je doute fortement que votre disque puisse lire les données plus rapidement que le processeur ne peut le gérer.

+1

Les configurations RAID ne peuvent-elles pas accélérer considérablement la lecture multisectorielle? – xtofl

+1

Oui, une configuration RAID appropriée ferait essentiellement la même chose que la division du fichier entre plusieurs disques. Je pense aussi que les disques à l'état solide pourraient fournir une amélioration substantielle, car ils peuvent lire à partir de plusieurs secteurs à la fois en raison de l'absence de nécessité de tourner. C'est pourquoi j'ai demandé plus d'informations sur sa capacité à améliorer son matériel. Je pense que l'E/S serait probablement le goulot d'étranglement, cependant. Les processeurs sont FAST FAST FAST. –

1

Je doute que la bande passante mémoire sera aussi gros d'un problème que les limitations d'E/S disque. Avec la plupart du matériel, vous allez être très limité sur la façon dont chaque thread peut lire sur le disque -

Si vous voulez maximiser le débit, vous devrez peut-être faire quelque chose comme avoir un thread dont le travail consiste à gérer les E/S du disque (la plupart des matériels ne peuvent diffuser qu'un seul morceau du disque à la fois, donc ce sera un facteur limitant). Il peut alors prendre cela et pousser des morceaux de mémoire vers des threads individuels dans un type de pool de threads à traiter. Je pense que votre traitement sera rapide - probablement beaucoup plus rapide que l'E/S du disque - mais s'il est lent, le fait d'avoir plusieurs threads de traitement pourrait accélérer l'ensemble de votre opération.

Plusieurs pointeurs FILE * fonctionneront, mais ils peuvent en fait être plus lents que les simples, puisqu'ils finiront par trancher le temps de lire le fichier, et que vous ferez plus de sauts sur votre disque.

0

si vous utilisez un lecteur SSD. vous pouvez surmonter ce problème avec la recherche parallèle à travers le fichier avec plusieurs pointeurs de fichiers.

Questions connexes