如何在Linux中分割巨大的CSV文件?

我有60个数据驻留在12个CSV文件中。

数据将被加载到加载进程为单线程的集群数据库中。 为了提高我的负载性能,我需要从每个节点启动一个加载过程。

从这个angular度来看这么好。 我最大的问题是如何分割这些数据? 它被压缩,每个csv文件有大约5TB的数据! 我尝试拆分,但它需要太长时间!

最简单但不是最快,最可能的方式是

unzip -p <zipfile> | split -C <size> 

假设数据的顺序不重要,一种方法 – 不是一个更快的方式,而是至less有点平行的方法是编写一个脚本,执行以下操作。

  1. 打开zip文件。
  2. 获取第一个文件。
  3. 从文件中读取数据,按行说。
  4. 对于每个csv行,写出一个新的包含该行的zip文件。
  5. 使用一行的输出旋转选定的文件(比如五个zip文件)。
  6. 一旦你达到一定的大小(比如50GB),创build一个全新的zip文件。

这并不比大文件的顺序读取快,但是可以将文件拆分成可以并行加载的小块,而剩余的数据完成。

像大多数压缩输出一样,它不是可search的(你不能跳过X字节),所以最大的缺点是如果进程由于某种原因中止,你将被迫重新开始整个事情。

Python通过zipfile模块为这样的事情提供支持。

你需要按顺序加载12个文件还是可以并行导入?

我问,因为看起来如果他们必须按顺序加载然后进一步拆分它们不会使你能够并行地运行任何东西,如果他们不这样做,那么你可以导入已经并行的12个文件。

如果这些文件在节点上不可用,则在那里传输它们可能需要与导入一样长的时间。

瓶颈可以出现在令人惊讶的地方。 你是否开始单线程导入过程,并validation节点未被充分利用? 如果你没有检查,你可能会解决错误的问题。