为什么 linux 拆分程序对大文件 >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和ad文件上做一个"du"。

$du -h ab ad
0   ab
0   ad

正如您所看到的,split以非齐次形式分割文件。有人知道发生了什么事吗?一些无法打印的字符可以挂拆分吗?非常感谢。顺致敬意,弗朗西斯科。

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

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

由于实现在v8.8和v8.13之间发生了一些变化,因此还值得指定版本。

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 
  }
}

最新更新