2010-09-02 4 views
1

J'ai un script Python qui fait quelque chose le long de la ligne de:façon simple de stocker des données à partir de plusieurs processus

def MyScript(input_filename1, input_filename2): 
    return val; 

dire pour chaque paire d'entrée, je calcule une valeur flottante. Notez que val est un double/float simple.

Étant donné que ce calcul est très intensif, je vais les exécuter sur différents processus (peut-être sur le même ordinateur, peut-être sur plusieurs ordinateurs).

Ce que je faisais auparavant était de sortir cette valeur dans un fichier texte: input1_input2.txt. Ensuite, je vais avoir 1000000 fichiers que je dois réduire en un seul fichier. Ce processus n'est pas très rapide car OS n'aime pas les dossiers qui ont trop de fichiers.

Comment obtenir efficacement toutes ces données dans un seul ordinateur? Peut-être que MongoDB fonctionne sur un ordinateur et que tous les processus envoient les données?

Je veux quelque chose de facile. Je sais que je peux le faire dans MPI mais je pense que c'est trop pour une tâche aussi simple.

Répondre

1

Si les entrées ont un ordre naturel pour eux, et chaque travailleur peut trouver "quelle" entrée sur laquelle il travaille, vous pouvez obtenir un fichier par machine. Étant donné que les flottants Python ont une longueur de 8 octets, chaque travailleur écrit le résultat dans son propre emplacement de 8 octets dans le fichier.

import struct 

RESULT_FORMAT = 'd' # Double-precision float. 
RESULT_SIZE = struct.calcsize(RESULT_FORMAT) 
RESULT_FILE = '/tmp/results' 

def worker(position, input_filename1, input_filename2): 
    val = MyScript(input_filename1, input_filename2) 
    with open(RESULT_FILE, 'rb+') as f: 
     f.seek(RESULT_SIZE * position) 
     f.write(struct.pack(RESULT_FORMAT, val)) 

Par rapport à l'écriture d'un tas de petits fichiers, cette approche devrait aussi être beaucoup moins d'E/S intensives, puisque de nombreux travailleurs seront en train d'écrire les mêmes pages dans le cache du système d'exploitation.

(Notez que sous Windows, vous aurez peut-être besoin d'une configuration supplémentaire pour permettre le partage du fichier entre les processus.)

0

Vous pouvez exécuter un programme qui collecte les sorties, par exemple sur XMLRPC.

1

Vous pouvez générer une structure de dossier qui contient généré des sous-dossiers qui contiennent des sous-dossiers générés. Par exemple, vous avez un dossier principal qui contient 256 sous-dossiers et chaque sous-dossier contient 256 sous-dossiers. 3 niveaux de profondeur seront suffisants. Vous pouvez utiliser des sous-chaînes de guids pour générer des noms de dossier uniques.

Par conséquent, le guide AB67E4534678E4E53436E devient le dossier AB qui contient le sous-dossier 67 et ce dossier contient le dossier E4534678E4E53436E.

L'utilisation de 2 sous-chaînes de 2 caractères permet de générer des dossiers 256 * 256. Plus que suffisant pour stocker 1 million de fichiers.

Questions connexes