2016-03-23 2 views
0

Я получил несколько файлов CSV, которые мне нужно объединить в один файл, все с общим ключом, который я могу использовать для их объединения. К сожалению, каждый из этих файлов имеет размер около 5 ГБ (несколько миллионов строк, около 20-100 + столбцов), поэтому нецелесообразно просто загружать их в память и выполнять объединение против каждого из них, но я знаю, что я не нужно беспокоиться о существующих конфликтах столбцов между ними.Выполнение соединений на очень больших наборах данных

Я попытался сделать индекс строки для каждого файла, соответствующего каждому идентификатору, поэтому я мог просто вычислить результат, не используя много памяти, но, конечно, это медленнее, когда время само по себе пытается на самом деле искать каждую строку, тянуть остальные данные CSV из строки, объединяют их с данными процесса и затем записывают в файл. Это просто невозможно, даже на SSD, обрабатывать миллионы строк в каждом файле.

Я также попробовал просто загрузить некоторые из меньших наборов в памяти и запустить параллель. Перед ними сопоставить необходимые данные, чтобы сбрасывать обратно во временный объединенный файл. Хотя это было быстрее, чем последний метод, у меня просто нет памяти для этого с большими файлами.

Мне бы хотелось просто сделать полное левое соединение с самым большим файлом, а затем полностью левым присоединиться к каждому последующему уменьшенному файлу, чтобы он все сливался.

Как я могу по-другому подойти к этой проблеме? У меня есть 24 ГБ памяти в этой системе для работы и шесть ядер для работы.

Хотя это может быть проблемой для загрузки в реляционную базу данных и присоединиться к ней, я подумал, что я дойду до этого маршрута, чтобы узнать, есть ли какие-либо идеи в решении этого вопроса из моего локальная система.

Спасибо!

ответ

1

реляционная база данных является первой вещью, которая приходит на ум, и, вероятно, самый простой, но за исключением этого ...

Построить хэш-ключ отображения таблицы в файл смещения. Разбирайте строки по запросу, когда вы присоединяетесь. Если ваше пространство ключей по-прежнему слишком велико для размещения в доступном адресном пространстве, вы также можете поместить его в файл. Это именно то, что будет делать индекс базы данных (хотя, возможно, с b-деревом).

Вы также можете предварительно сортировать файлы на основе их ключей и выполнить объединение слияния.

0

Я не уверен, что вы манипулируете данными. Но если просто объединить csv, вы можете попробовать это ... http://www.solveyourtech.com/merge-csv-files/

+0

К сожалению, у меня есть необходимость присоединения к нему с ключом (который к счастью, в первом столбце всех файлов), поэтому я не могу просто конкатенировать все, но спасибо! – Xaniff

1

Хорошей новостью является то, что «несколько» файлов объемом 5 ГБ не являются огромным количеством данных. Я знаю, что это относительный, но способ описания вашей системы ... Я все еще думаю, что это неважно. Если вам не нужно было присоединяться, вы можете использовать Perl или кучу других инструментов командной строки.

Известны ли имена столбцов в каждом файле? Вы интересуетесь именами столбцов?

Мои первые мысли:

  1. раскрутить Amazon Web Services (AWS) Упругие MapReduce (ЭМИ) экземпляра (даже очень маленький один будет работать)
  2. закачать файлы
  3. Импорт файлов в Улей (как управляемый или нет).
  4. Выполняйте свои объединения в Улье.

Вы можете развернуть экземпляр за считанные минуты и выполнить работу в течение часа или около того, в зависимости от вашего уровня комфорта с материалом.

Я не работаю для Amazon и не могу использовать их материал во время моей дневной работы, но я использую его совсем немного для школы градиента. Он работает как чемпион, когда вам нужен собственный большой кластер данных. Опять же, это не «большие данные (R)», но «Улей» убьет это за вас в кратчайшие сроки.

Эта статья не делает то, что вам нужно (она копирует данные с S3); Однако, это поможет вам понять создание таблицы и т.д. http://aws.amazon.com/articles/5249664154115844

Edit: Вот ссылка на обзор ОГО: https://aws.amazon.com/elasticmapreduce/

Смежные вопросы