2014-07-23 11 views
0

souffle bien, profond, cela peut être un peu bavard, mais il vaut mieux pécher par excès de détails que son absence ...moyen efficace de recouper plusieurs fichiers volumineux contenant géodonnées

Ainsi, en une phrase, mon but est de trouver l'intersection d'environ 22 ~ 300-400mb fichiers basés sur 3 des 139 attributs .:

Maintenant un peu plus d'arrière-plan. Les fichiers s'étendent de ~ 300-400mb, composé de 139 colonnes et généralement dans la gamme de 400 000-600 000 lignes. J'ai trois champs particuliers auxquels je veux m'inscrire - un identifiant unique, et une latitude/longitude (avec un peu de tolérance si possible). Le but est de déterminer lesquels de ces fichiers ont existé dans certaines plages de fichiers. Dans le pire des cas, cela signifiera une intersection de 22 fichiers.

Jusqu'à présent, ce qui suit a échoué

J'ai essayé d'utiliser MySQL pour effectuer la jointure. C'était de retour quand je regardais seulement 7 ans. Tentative de jointure sur 7 ans (utilisation de INNER JOIN environ 7 fois ... par exemple t1 INNER JOIN t2 ON condition INNER JOIN t3 ON condition ... etc), je l'ai laissé fonctionner pendant environ 48 heures avant la fin du timeout. Était-ce probablement toujours en cours d'exécution, ou cela semble-t-il trop long? Malgré toutes les suggestions que j'ai trouvé pour permettre un meilleur multithreading et plus d'utilisation de la RAM, je ne pouvais pas sembler obtenir l'utilisation du processeur au-dessus de 25%. Si c'est une bonne approche à suivre, tous les conseils seraient grandement appréciés.

J'ai essayé d'utiliser ArcMap. J'ai converti les fichiers CSV en tables et les ai importés dans une géodatabase fichier. J'ai couru l'outil d'intersection sur deux fichiers, ce qui a pris environ 4 jours, et le nombre d'enregistrements retournés était plus de deux fois le nombre d'entités d'entrée combinées. Chaque fichier contenait environ 600 000 enregistrements. L'intersection est revenue avec 2.000.0000 résultats. Dans d'autres cas, tous les enregistrements n'ont pas été reconnus par ArcMap. ArcMap dit qu'il y a 5 000 enregistrements, alors qu'en réalité il y en a 400 000+

J'ai essayé de combiner en python. Premièrement, je peux immédiatement dire que la RAM va poser un problème. Chaque fichier occupe environ 2 Go de RAM en python lorsqu'il est complètement ouvert. Je le fais avec:

f1 = [row for row in csv.reader(open('file1.csv', 'rU'))] 
f2 = [row for row in csv.reader(open('file2.csv', 'rU'))] 
joinOut = csv.writer(open('Intersect.csv', 'wb')) 
uniqueIDs = set([row[uniqueIDIndex] for row in f1].extend([row[uniqueIDIndex] for row in f2])) 
for uniqueID in uniqueIDs: 
    f1rows = [row for row in f1 if row[uniqueIDIndex] == uniqueID] 
    f2rows = [row for row in f2 if row[uniqueIDIndex] == uniqueID] 
    if len(f1rows) == 0 or len(f2rows) == 0: 
     //Not an intersect 
    else: 
     // Strings, split at decimal, if integer and first 3 places 
     // after decimal are equal, they are spatially close enough 
     f1lat = f1rows[0][latIndex].split('.') 
     f1long = f1rows[0][longIndex].split('.') 
     f2lat = f2rows[0][latIndex].split('.') 
     f2long = f2rows[0][longIndex].split('.') 
     if f1lat[0]+f1lat[1][:3] == f2lat[0]+f2lat[1][:3] and f1long[0]+f1long[1][:3] == f2long[0]+f2long[1][:3]: 
      joinOut.writerows([f1rows[0], f2rows[0]])   

Évidemment, cette approche nécessite que les fichiers en cours d'intersection soient disponibles en mémoire. Eh bien, j'ai seulement 16 Go de RAM disponible et 22 fichiers auraient besoin de ~ 44 Go de RAM. Je pourrais le changer de sorte qu'au lieu de cela, lorsque chaque identifiant unique est itéré, il ouvre et analyse chaque fichier pour la ligne avec cet uniqueID. Cela a l'avantage de réduire l'empreinte à presque rien, mais avec des centaines de milliers d'identifiants uniques, cela pourrait prendre un temps déraisonnable à s'exécuter.

Alors, me voilà, demandant des suggestions sur la meilleure façon de gérer ces données. J'ai un i7-3770k à 4,4 GHz, 16 Go de RAM, et un SSD vertex4, évalué à 560 Mo/s vitesse de lecture. Cette machine est-elle capable de gérer cette quantité de données?

Un autre endroit que j'ai pensé explorer est un cluster Amazon EC2 et Hadoop. Serait-ce une meilleure idée d'enquêter?

+4

Je ne sais pas si je comprends votre problème, mais ne pourriez-vous pas pré-traiter tous les fichiers pour extraire les 3 attributs qui vous intéressent en premier? Vous pouvez également garder une trace du fichier/rownumber, ainsi vous pouvez référencer tous les attributs originaux plus tard si vous le souhaitez. – Gerrat

+0

Un de ces moments où vous passez des jours à vous battre la tête contre un mur juste pour voir une suggestion comme celle-ci et penser gahhh, où était cette idée quand j'en avais besoin? Quoi qu'il en soit, un bon conseil. J'ai écrit un script pour nettoyer les fichiers aux trois attributs, et maintenant je croise ces fichiers. Je peux avoir tous les 22 ouverts maintenant, avec quelques autres dictionnaires pour des recherches rapides, à ~ 4.5GB RAM utilisé. Et au rythme où ça va, il me semble qu'il faudra environ 7-8 heures pour finir l'intersection. Ensuite, je vais devoir revenir à travers les fichiers et obtenir les lignes correspondantes. Merci encore! Si vous répondez je vous marquerai accepté – user1028885

+0

Nous avons tous ces moments :) – Gerrat

Répondre

0

Suggestion: Prétraitez tous les fichiers pour extraire les 3 attributs qui vous intéressent en premier. Vous pouvez également garder une trace du fichier/rownumber, ainsi vous pouvez référencer tous les attributs originaux plus tard si vous le souhaitez.

Questions connexes