我有一个RoR项目,我必须使用巨大的3.5GB CSV文件填充数据库。
我无法上传3.5GB到github,但我必须使用它,再加上这么大的文件是硬内存老虎机。
我该如何解决这个问题?
答案 0 :(得分:1)
首先,绝对没有理由将您的数据提交给Git。您应该使用migration
由于数据量很大,您可以直接使用数据库来加载数据。您可能必须确保您的CSV格式正确,但这很简单。
根据您的数据库,您可以使用LOAD DATA或COPY,请参阅此SO问题 MySQL LOAD DATA INFILE with PostgreSQL COPY FROM command
答案 1 :(得分:1)
我实际上经常这样做。在尝试这样的事情时,你需要考虑一些事情:
- 此应用是否会获得大量外部用户流量或关键内部用户流量?
- 对于这个长期运行的工作,这台服务器是否会受到商业影响?
- 托管此应用程序的服务器是否具有处理此类作业所需的资源(内存和硬盘空间)?
- 您是否有SCP访问主机服务器以将文件传输到服务器?
一旦您对上述内容有了充分的了解,您应该执行以下操作。
编写CSV导入脚本(可能是rake任务),不要使用默认的ruby CSV库,使用faster cvs或smarter cvs之类的东西(它们更快)。确保在编写导入脚本时使用库的枚举器函数,以避免将整个电子表格加载到内存中(foreach)。此外,由于这可能是一个长期运行的工作,放一些反馈输出(如看跌期权或计数器),以便你有一些洞察力去做什么。
使用实际的电子表格在本地测试脚本,我不知道数据的完整性是什么,但在电子表格中,您可能会遇到字符编码问题。最好是在生产过程中没有一堆失败的运行时弄清楚你的数据库。
部署代码
压缩CSV
将压缩的CSV传输到指定的目录
解压缩CSV
运行导入脚本
检查数据是否有成功导入的迹象,例如记录的差异。
删除CSV