Эффективный способ пересечения нескольких больших файлов, содержащих геоданные

Вопрос:

Ладно, глубокий вдох, это может быть немного многословным, но лучше ошибиться на стороне деталей, чем их отсутствия…

Итак, в одном предложении моя цель – найти пересечение около 22 ~ 300-400mb файлов на основе 3 из 139 атрибутов:

Теперь немного больше фона. Файлы варьируются от ~ 300-400 мб, состоящие из 139 столбцов и обычно в диапазоне 400 000-600 000 строк. У меня есть три конкретных поля, к которым я хочу присоединиться: уникальный идентификатор и широта/долгота (с небольшим допуском, если это возможно). Цель состоит в том, чтобы определить, какой из них был сохранен в определенных диапазонах файлов. Переход на худший случай, это будет означать выполнение 22-х файлов пересечения.

До сих пор не удалось выполнить следующие действия:

Я попытался использовать MySQL для выполнения соединения. Это было назад, когда я смотрел только 7 лет. Попытка соединения через 7 лет (с использованием INNER JOIN около 7 раз… например, t1 INNER JOIN t2 ON condition INNER JOIN t3 ON condition… и т.д.), Я пропустил его около 48 часов до истечения таймаута. Вероятно, он все еще работает, или это кажется слишком длинным? Несмотря на все предложения, которые, как мне показалось, позволяют улучшить многопоточность и больше использования ОЗУ, я не мог бы заставить процессор использовать более 25%. Если это хороший подход к преследованию, любые советы будут высоко оценены.

Я попытался использовать ArcMap. Я преобразовал CSV в таблицы и импортировал их в базу геоданных файлов. Я запустил инструмент пересечения на два файла, что заняло около 4 дней, а количество возвращенных записей было более чем в два раза больше объединенных входных функций. В каждом файле было около 600 000 записей. Пересечение вернулось с результатом 20000000. В других случаях не все записи были распознаны ArcMap. ArcMap говорит, что есть 5000 записей, когда на самом деле их 400, 000+

Я попробовал комбинировать в python. Во-первых, я могу сразу сказать, что ОЗУ будет проблемой. Каждый файл занимает примерно 2 ГБ оперативной памяти в python, когда он полностью открыт. Я делаю это с помощью:

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]])

Очевидно, что этот подход требует, чтобы файлы, которые были пересекаются, были доступны в памяти. Ну, я имею только 16 ГБ оперативной памяти, и 22 файлам потребуется ~ 44 ГБ ОЗУ. Я мог бы изменить его так, чтобы вместо этого, когда каждый уникальный идентификатор был итерирован, он открывает и анализирует каждый файл для строки с этим уникальным идентификатором. Это позволяет сократить площадь почти до нуля, но с сотнями тысяч уникальных идентификаторов, которые могут потребовать неоправданного количества времени для выполнения.

Итак, я здесь, прося предложения о том, как я могу лучше всего обрабатывать эти данные. У меня есть i7-3770k на 4,4 ГГц, 16 ГБ оперативной памяти и SSD с вершинным разрешением, скорость чтения 560 МБ/с. Эта машина даже способна обрабатывать этот объем данных?

Другое место, которое я подумал об изучении, – это кластер Amazon EC2 и Hadoop. Будет ли лучше исследовать?

Лучший ответ:

Предложение. Предварительно обработайте все файлы, чтобы извлечь 3 атрибута, которые вас интересуют в первую очередь. Вы всегда можете отслеживать файл/роутинг, так что вы можете ссылаться на все исходные атрибуты позже, если хотите.

Оцените статью
TechArks.Ru
Добавить комментарий