2016-10-09 5 views
1

У меня есть проект RoR, где я должен заполнить базу данных огромным CSV-файлом 3,5 ГБ.Как работать с огромным CSV-файлом (3,5 ГБ) с github

Я не могу загрузить 3.5 ГБ в github, но я должен использовать его, а также работать с таким огромным файлом - это жесткие тиски памяти.

Как я могу решить эту проблему?

+1

Я думаю, что вы могли бы искать Git LFS https://git-lfs.github.com/ – AppleCrazy

+1

Я бы не грызть файл CSV 3.5gb производства. Сделайте это на своей локальной машине и экспортируйте дамп базы данных с помощью pgbackups или разделите на более мелкие файлы csv, которые могут быть импортированы в пакет. – max

+0

Базы данных и снимки семян обычно не включаются в репозитории 'git', потому что они делают будущие клоны репо невероятно медленными, особенно если вы уронили в них что-то тяжелое. Почему бы не предварительно обработать это и предоставить его в виде отдельной загрузки с сервера, которым вы управляете? – tadman

ответ

1

я на самом деле сделать это примерно то, что часто. Есть кое-что, что вам нужно учитывать при попытке сделать что-то вроде этого:

-Поскольку это приложение получает много внешнего трафика пользователя или критического внутреннего трафика пользователя?

-Это бизнес-последствия для этого сервера увязли в этой длительной работе?

-Уверено ли на сервере, на котором размещено это приложение, требуются ли ресурсы (память и пространство на жестком диске) для обработки такой работы?

-У вас есть доступ SCP к серверу хоста для передачи файла на сервер?

Как только вы хорошо понимаете вышеизложенное, вы должны сделать следующее.

  1. Написать сценарий импорта CSV (вероятно, кутила задача), не следует использовать рубиновый по умолчанию использовать библиотеки CSV-то тому подобное faster cvs или smarter cvs (они быстрее). Убедитесь, что при написании сценария импорта вы используете функцию перечислителя библиотеки, которая позволит избежать загрузки всей электронной таблицы в память (foreach). Кроме того, поскольку это, вероятно, будет длительная работа, поставьте некоторый выходной поток (например, puts или counter), чтобы у вас было некоторое представление о том, что происходит.

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

  3. Развертывание код

  4. Сжать CSV

  5. Передача сжатого CSV в указанный вами каталог

  6. распаковка CSV

  7. Выполнить импорт сценария

  8. Проверьте данные f или признаки успешного импорта, как разница в записях.

  9. Удалить CSV

+0

Большое спасибо за ваш очень хорошо написанный ответ. Могу ли я спросить вас, какой инструмент вы обычно используете для сжатия CSV, я закончил использование Heorku PG Backups. https://devcenter.heroku.com/articles/heroku-postgres-import-export –

+0

Я обычно работаю на ubuntu, поэтому я просто создаю файлы tar, см. здесь http://www.cyberciti.biz/faq/ubuntu-howto- сжимает-файлы, используя-тары / –

1

Прежде всего, нет никаких оснований для передачи данных Git. Вы должны использовать migration

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

В зависимости от вашей базы данных вы можете использовать LOAD DATA или COPY см это так вопрос для этого MySQL LOAD DATA INFILE with PostgreSQL COPY FROM command

+1

Даже если я не принял ваш ответ в качестве основного, я хотел поблагодарить вас, потому что ваш ответ был самым быстрым и заставил меня использовать резервные копии Heroku PG, которые решили мою проблему. Большое спасибо. –