我有一个包含大约 100000 个小文件的目录(每个文件有 1-3 行,每个文件都是一个文本文件)。目录的大小不是很大(< 2GB)。这些数据存在于专业管理的 NFS 服务器中。服务器运行Linux。我认为文件系统是 ext3,但我不确定。另外,我没有对服务器的 root 访问权限。
这些文件是大规模科学实验的输出,我无法控制。但是,我必须分析结果。
此目录中的任何 I/O 操作/处理都非常非常慢。打开一个文件(python 中的 fopen),读取一个打开的文件,关闭一个文件,都非常慢。在 bash 中 ls、du 等不起作用。
问题是:
Linux 中一个目录中的最大文件数是多少,以便可以进行处理、打开、读取等操作?我知道答案取决于很多事情:fs 类型、内核版本、服务器版本、硬件等。如果可能的话,我只想要一个经验法则。
本着与另一个问题相同的精神:cat line X to line Y on a large file:
有没有办法从 Emacs 中打开(并在缓冲区上显示)来自巨大文本文件的一组给定的行(例如 lineX
和之间的所有行Y
)?
例如,打开并在缓冲区中显示文件中第 57890000 行和 57890010 行之间的所有行 huge.txt
更新: 我对至少可以以只读方式打开行(仅用于显示目的)的解决方案感兴趣,尽管如果我也可以编辑行(并保存到原始文件)会很棒。
我有一个 250 MB 的文本文件,全部在一行中。
在这个文件中,我想a
用b
字符替换字符:
sed -e "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)
它失败了:
sed: couldn't re-allocate memory
Run Code Online (Sandbox Code Playgroud)
在我看来,这种任务可以在不分配太多内存的情况下内联执行。
是否有更好的工具,或者更好的使用方法sed
?
GNU sed 版本 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
我有 ~30k 文件。每个文件包含约 10 万行。一行不包含空格。单个文件中的行已排序且无重复。
我的目标:我想找到两个或多个文件中的所有重复行,以及包含重复条目的文件的名称。
一个简单的解决方案是这样的:
cat *.words | sort | uniq -c | grep -v -F '1 '
Run Code Online (Sandbox Code Playgroud)
然后我会跑:
grep 'duplicated entry' *.words
Run Code Online (Sandbox Code Playgroud)
你看到更有效的方法吗?
performance large-files shell-script text-processing deduplication
我需要在 Linux 上查看一个大的(50000x40000 像素)png 图像。不幸的是,大多数工具(eog、convert 等)要么崩溃要么失败,并提示内存太少。
有没有办法查看这个图像(我更喜欢看到调整大小的图像和细节)?
我有大约 200 万 (60GiB) 个 gzip 小文件,我想创建一个压缩存档,其中包含所有这些文件的未压缩版本。不幸的是,我不能只是解压缩它们然后创建压缩档案,因为我只有大约 70GiB 的可用磁盘空间。换句话说,tar --file-filter="zcat" zcf file.tar.gz directory
如果--file-filter
GNU tar 中不存在命令行开关,我该如何做?
我需要将同一台计算机上的一个非常大的文件 (3TB) 从一个外部驱动器复制到另一个外部驱动器。这可能需要(由于带宽较低)很多天。
因此,我想在必须中断复制并在重新启动后恢复复制时做好准备。根据我读过的内容,我可以使用
rsync --append
Run Code Online (Sandbox Code Playgroud)
为此(rsync版本> 3)。关于国旗的两个问题--append
:
任何人都可以推荐一个文件编辑器,最好是免费的,它可以处理大文件以及Windows 上的 EmEditor吗?我在 Ubuntu 上,但其他人可能不是,所以也欢迎对其他 Unix 操作系统的建议。
我有两个文本文件。一种是带有姓名、电子邮件地址和其他字段的文本文件。一些线路来自file1
:
John:myemail@gmail.com:johnson123:22hey
Erik:thatwhatsup@gmail.com:johnson133:22hey
Robert:whatsup@gmail.com:johnson123:21hey
Johnnny:bro@gmail.com:johnson123:22hey
Run Code Online (Sandbox Code Playgroud)
另一个只包含电子邮件地址。示例来自file2
:
1@gmail.com
rsdoge@gmail.com
mynameiscurt@hotmail.com
myemail@gmail.com
Run Code Online (Sandbox Code Playgroud)
我希望输出是每个完整的行,file1
在file2
. 例如,myemail@gmail.com
is in file2
,所以我想看到以下行file1
:
John:myemail@gmail.com:johnson123:22hey
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来搜索file1
和输出与“电子邮件地址列表”匹配的行file2
?
我一直在搜索 HOURS,但我的 Google 搜索(和 StackOverflow 搜索)以及在命令行上的努力到目前为止还没有奏效。
我尝试过并认为可行的命令:
fgrep -f file2.txt file1.txt > matched.txt
grep -F -f ....
grep -F -x -f file1 file2 > common
Run Code Online (Sandbox Code Playgroud)
等等,但他们都得到了grep memory exhausted
- 我匹配的文件是 4.8GB ( file1
) 和 3.2GB ( file2
,仅包含电子邮件地址)。我假设这些命令会耗尽内存。我找到了一种方法find
,我想可以更顺畅地执行命令,但没有让它起作用。
tldr ; 需要匹配file2
, …
我有一个包含 30M 小文件的大文件夹。我希望将文件夹备份成 30 个档案,每个 tar.gz 文件将有 1M 个文件。拆分成多个档案的原因是解压一个大档案需要一个月的时间。要拆分的管道 tar 也不起作用,因为在解压文件时,我必须将所有档案一起分类。
另外,我希望不要将每个文件 mv 到一个新目录,因为对于这个巨大的文件夹,即使是 ls 也是非常痛苦的。
large-files ×10
filesystems ×2
linux ×2
performance ×2
tar ×2
compression ×1
disk-usage ×1
editors ×1
emacs ×1
file-copy ×1
grep ×1
images ×1
rsync ×1
sed ×1
shell-script ×1