为什么linux拆分程序对大文件> 20GB有奇怪的行为?

时间:2015-06-23 13:31:44

标签: linux split

我正在我的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

如您所见,拆分将文件分成非同类形式。 有谁知道发生了什么? 一些不可打印的角色可以悬挂分裂吗? 谢谢。 最好的祝福! 旧金山。

2 个答案:

答案 0 :(得分:1)

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

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

它也值得指定版本,因为实现在v8.8和v8.13之间略有改变

答案 1 :(得分:0)

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 
  }

}