4

我有一个要加载到 mysql 中的大型 xml 文件。它大约有 20 GB 未压缩,但我认为我可以将其压缩到其原始大小的 25% 左右,然后将其批量上传到压缩表中。

我知道我可以压缩数据库本身的数据,但它可以在批量添加过程中读取压缩文件吗?

编辑:通过压缩我并不意味着它是一个 .gz.tar 文件或任何东西。我的意思是当我在 Java 或 C++ 中创建文件时,我将它作为 gzip 输出,因此文件本身是 .csv 或 .xml 并保留正确的结构,但其中的项目(每一行)被压缩。

如果这是不可能的,我可以做一些像批量上传但以某种方式通过解压缩内容的程序过滤它吗?我正在考虑在 C 中打开文件并在将其加载到 mysql 时对其进行压缩。问题是我想在批量插入中执行此操作,而不是数百万个单独的插入。

4

3 回答 3

10

您绝对应该为此使用LOAD DATA INFILE。插入可能比 LOAD DATA INFILE 慢一个数量级,尤其是在较大的文件上。

不幸的是,MySQL 本身并不支持直接加载压缩文件(据我所知,任何类型的)。但是,如果您查看上面的 LOAD DATA INFILE 链接,有一个技巧可以将数据直接从管道加载到表中(只需在页面上搜索“管道”)。我想您可以使用该方法解压缩文件并将输出通过管道传输到 MySQL,但压缩/解压缩显然比直接加载未压缩文件要慢。

于 2012-06-12T15:13:25.637 回答
7
$ mkfifo --mode=0666 /tmp/namedPipe
$ gzip --stdout -d file.gz > /tmp/namedPipe

然后将未压缩的数据加载到 MySQL 表中,如下所示:

LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
于 2015-03-09T14:30:48.433 回答
2

不要使用 '--mode=-666' ,除非您希望系统上的每个其他用户都能够写入管道。使用“--mode=-600”,并将管道保存在本地主目录中,以降低未经授权访问的风险。

于 2015-08-06T16:07:53.460 回答