为什么 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 之间的实现发生了一些变化
我正在 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 之间的实现发生了一些变化