Как эффективно объединить огромные CSV-файлы (1000 столбцов и 1000 строк), используя C / C ++? - PullRequest
1 голос
/ 08 августа 2011

У меня есть несколько (1-5) очень широких (~ 50 000 столбцов) .csv файлов. Размер файлов (.5GB-1GB) (средний размер около 500 МБ). Мне нужно выполнить объединение файлов по заранее указанному столбцу. Эффективность - это, конечно, ключ. Любые решения, которые можно масштабировать для эффективного разрешения нескольких столбцов объединения, являются бонусом, хотя в настоящее время не требуются. Вот мои входные данные:

-Первичный файл

-Вторичный файл (ы)

-Присоединить столбец первичного файла (имя или позиция в столбце)

-Соединение столбца вторичного файла (имя или позиция в столбце)

-Левое присоединение или внутреннее присоединение?

Выход = 1 Файл с результатами многофайлового объединения

Я ищу решение проблемы с использованием языка Си, но, конечно, было бы очень полезно алгоритмическое решение.

Ответы [ 4 ]

3 голосов
/ 09 августа 2011

Предполагая, что у вас есть веская причина не использовать базу данных (насколько я знаю, 50 000 столбцов могут представлять собой такую ​​причину), у вас, вероятно, нет другого выбора, кроме как стиснуть зубы и создать себе индекс для правильного файла , Прочитайте его последовательно, чтобы заполнить хеш-таблицу, где каждая запись содержит только ключевой столбец и смещение в файле, где начинается вся строка. Тогда сам индекс должен удобно помещаться в памяти, и если у вас достаточно адресного пространства (т.е. если вы не застряли с 32-битной адресацией), вам следует отобразить в памяти фактические данные файла, чтобы вы могли получить доступ и вывести соответствующие правильные строки легко, как вы последовательно проходите через файл left .

2 голосов
/ 08 августа 2011

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

Для фактического чтения данных, вы можете просто идти строка за строкой и вставлять поля в Sqlite, не нужно разрушать объекты объектов в кеше :) В качестве оптимизации вы должны сгруппировать несколько вставок в одном выражении ( insert into table(...) select ... union all select ... union all select ...).

1 голос
/ 08 августа 2011

Если вам нужно использовать C или C ++, откройте файл и загрузите файл непосредственно в базу данных, такую ​​как MySQL.Языки C и C ++ не имеют адекватных структур таблиц данных или функциональных возможностей для манипулирования данными.Приложение для работы с электронными таблицами может быть полезным, но может не справиться с возможностями.

Тем не менее, я рекомендую объекты для каждого поля (столбца).Определите запись (специфичную для файла) как набор полей.Читать текстовую строку из файла в строку.Пусть запись загружает данные поля из строки.Храните записи в vector.

Создать новую запись для файла назначения.Для каждой записи из входного файла (ов) загрузите новую запись, используя эти поля.Наконец, для каждой записи выведите содержимое каждого поля с разделительными символами.

Альтернативой является создание двумерной матрицы строк.

Узким местом вашей производительности будет I / O.Возможно, вы захотите прочитать огромные блоки данных. Опасность эффективности - переменная длина записи файла CSV.

Я все еще рекомендую использовать базу данных.Есть много бесплатных, таких как MySQl.

0 голосов
/ 09 августа 2011

Это зависит от того, что вы подразумеваете под «присоединиться».Являются ли столбцы в файле 1 такими же, как в файле 2?Если это так, вам просто нужна сортировка слиянием.Скорее всего, решение, основанное на сортировке слиянием, является «лучшим».Но я согласен с @Blindy выше, что вы должны использовать существующий инструмент, такой как Sqlite.Такое решение, вероятно, является более надежным в будущем против изменений в списках столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...