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

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

我有 60TB 的数据,存储在 12 个 csv 文件中。

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

从这个角度来看,到目前为止一切都很好。我最大的问题是如何拆分这些数据?它是压缩的,每个 csv 文件都有大约 5TB 的数据!我试过拆分,但花费的时间太长了!

答案1

最简单但不是最快、最有可能的方法是

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

答案2

假设数据的顺序不重要,那么实现此目的的一种方法(不是更快的方法)但至少在某种程度上是并行的,即编写执行以下操作的脚本。

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

这并不比顺序读取大文件更快,但允许您将文件分割成较小的块,这些块可以在剩余数据完成时并行加载。

与大多数压缩输出一样,它不可查找(您不能向前跳过 X 个字节),因此最大的缺点是,如果该过程由于某种原因中止,您将被迫从头开始重新启动整个过程。

Python 通过以下方式支持执行此类操作压缩文件模块。

答案3

您必须按顺序加载这 12 个文件还是可以并行导入?

我之所以问这个问题,是因为看起来如果它们必须按顺序加载,那么进一步拆分它们似乎不会让你并行运行任何东西,如果不能,那么你可以并行导入你已经拥有的 12 个文件。

如果文件尚未在节点上提供,则将它们传输到节点所花的时间可能与导入时间一样长。

瓶颈可能出现在意想不到的地方。您是否已启动单线程导入过程并验证节点未得到充分利用?如果您尚未检查,则可能正在解决错误的问题。

相关内容