为什么 linux split 程序对大于 20GB 的大文件有奇怪的行为?

Why linux split program have weird behavior with large files >20GB?

我正在 ubuntu 上做下一条声明:

split --number=l/5 /pathToSource.csv /pathToOutputDirectory

如果我做 "ls"

myUser@serverNAme:/pathToOutputDirectory> ls -la

total 21467452 
drwxr-xr-x 2 myUser group        4096 Jun 23 08:51 .
drwxrwxrwx 4 myUser group        4096 Jun 23 08:44 ..
-rw-r--r-- 1 myUser group 10353843231 Jun 23 08:48 aa
-rw-r--r-- 1 myUser group           0 Jun 23 08:48 ab
-rw-r--r-- 1 myUser group 11376663825 Jun 23 08:51 ac
-rw-r--r-- 1 myUser group           0 Jun 23 08:51 ad
-rw-r--r-- 1 myUser group   252141913 Jun 23 08:51 ae

如果我对 ab 和广告文件执行 "du"。

$du -h ab ad
0   ab
0   ad

如您所见,split 以非均匀形式分割了文件。 有人知道发生了什么事吗? 一些不可打印的字符可以挂split吗? 谢谢你。 最好的祝福! 弗朗西斯科.

groovy 中的解决方法:

class Sanitizer {
  public static void main(String[] args) {
    def textOnly = new File('/path/NoDanger.txt')
    def data = new File('/path/danger.txt')
    String line = null
    data.withReader { reader ->
      while (  ( line = reader.readLine() ) != null  ){
        /*char[] stringToCharArray = line.toCharArray();
        for(int i = 0; i < 5; i++ ){
          char a = stringToCharArray[i]
          int b = Character.getNumericValue(a);
          println Integer.toHexString(b)
            if (!(b =~ /\w/)) {
              println "inside" 
            } else println "outside" 
        }*/
        String newString = line.replaceAll("[^\p{Print}]", "");
        textOnly << newString+"\n"
      }
    } //reader 
  }

}

虽然这是平均行长度为 114137 的不寻常数据,但我不确定是否完全描述了问题。嗯,你有 21982648969 的数据 => 每个拆分试图填充的桶是 4396529793。这大于 2^32。我想知道我们是否有 32 位溢出。您使用的是 32 位还是 64 位平台?查看代码,我没有看到溢出问题 TBH。请注意,您可以匿名化和压缩数据,提供以下文件供在某处下载:

tr -c '\n' . < /pathToSource.csv | xz > /pathToSource.csv.xz

还值得指定版本,因为 v8.8 和 v8.13 之间的实现发生了一些变化