我有两个二进制文件。
几百公斤之一,其他几千兆字节。
我想知道整个较小的文件是否包含在较大的文件中,如果是,那么与较大文件开头的偏移量是多少。
我只对精确匹配感兴趣,即整个文件是否包含在另一个文件中。
这两个文件都是二进制文件。
是否有任何现有的工具/单线可以做到这一点?
这是我现在所做的,
sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv
该文件是 90GB,我收到此错误消息
sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded
以前,我没有使用 -T 选项,显然 tmp 目录不足以处理这个问题。我当前的目录有大约 200GB 的可用空间。排序临时文件还不够吗?
我不知道并行选项是否会影响事情。
我们想copytruncate
在使用logrotate
以下配置旋转文件之前 了解:
/app/syslog-ng/custom/output/all_devices.log {
size 200M
copytruncate
dateext
dateformat -%Y%m%d-%s
rotate 365
sharedscripts
compress
postrotate
/app/syslog-ng/sbin/syslog-ng-ctl reload
endscript
}
Run Code Online (Sandbox Code Playgroud)
RHEL 7.x,8GB 内存,4 VCpu
题:
logrotate
当 syslog-NG 已经打开文件进行日志记录时,如何截断文件?不是资源的争用吗?当文件没有任何记录时,syslog-NG 是否会立即关闭文件?
很简单的问题,但似乎找不到简单的解决方法!
我有一个庞大的文本文件,我只需要大约 150 行。线条真的很长,因此在腻子中查看它有点像一场噩梦。我只想将这些行复制到另一个文件中,以便我可以在编辑器中正确查看它。(我无法在编辑器中查看原始文件,因为我的 Windows 机器无法处理它)。
我想要的行从 2000 行左右开始。
谢谢,
我有来自故障硬盘驱动器的两个部分磁盘映像。文件 B 包含磁盘的大部分内容,在扇区读取失败的地方存在间隙。文件 A 是告诉ddrescue
重试所有失败扇区的结果,因此它几乎完全是空白,但包含一些重读成功的地方。我现在需要将文件 A 的有趣内容合并回文件 B。算法很简单:
while not eof(A):
read 512 bytes from A
if any of them are nonzero:
seek to corresponding offset in B
write bytes into B
Run Code Online (Sandbox Code Playgroud)
我可以坐下来自己写这个,但我首先想知道是否其他人已经编写并调试了它。
(更复杂的是,由于空间有限,文件 B 和文件 A 位于两台不同的计算机上——这就是为什么我没有告诉ddrescue
首先尝试填补 B 中的空白——但 A 可以是通过网络传输相对容易,稀疏。)
这么大的目录怎么删除呢?
\nstat session/\n File: \xe2\x80\x98session/\xe2\x80\x99\n Size: 321540096 Blocks: 628040 IO Block: 4096 directory\nDevice: 903h/2307d Inode: 11149319 Links: 2\nAccess: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2022-09-29 14:34:40.910894275 +0200\nModify: 2022-09-29 14:35:09.598400050 +0200\nChange: 2022-09-29 14:35:09.598400050 +0200\n Birth: -\n
Run Code Online (Sandbox Code Playgroud)\n请注意,目录的大小(不是内容,而是目录项本身)超过 300MB。\ninode 数量超过 1100 万个。
\n该目录没有子目录,只有大量文件。
\n常用命令都不起作用。我已经尝试过这些:
\nrsync -a --delete empty_dir/ session/
rm -rf session
find . -type f --delete
如果我跑ls -f1
进去,它就会挂起。
如果我跑mv -- * ../.tmp_to_delete
进去,它就会挂起。 …
我有一个包含图像文件的大型 tar 文件 (60GB)。我正在使用mmap()
整个文件来读取这些随机访问的图像。
我使用mmap()
的原因如下:
问题是当我阅读了那个 60GB 文件中的每个图像时会发生什么?当然,并不是所有的图像都被一次使用——它们被读取、显示,然后被丢弃。
我的mmap()
电话是:
mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0);
Run Code Online (Sandbox Code Playgroud)
问题是:内核是否看到我映射了由文件支持的只读页面,并在内存压力下简单地清除未使用的页面?我不确定这种情况是否被认可。手册页表明MAP_NORESERVE
不需要备份交换空间,但似乎不能保证在内存压力下页面会发生什么。是否有任何保证内核会在它之前清除我不需要的页面,例如清除文件系统缓存或 OOM 的另一个进程?
谢谢!
我有超过 300K 行的 FILE_A 和超过 30M 行的 FILE_B。我创建了一个 bash 脚本,它将 FILE_A 中的每一行 grep 到 FILE_B 中,并将 grep 的结果写入一个新文件。
整个过程需要超过 5 个多小时。
我正在寻找有关您是否看到任何提高脚本性能的方法的建议。
我使用 grep -F -m 1 作为 grep 命令。FILE_A 看起来像这样:
123456789
123455321
Run Code Online (Sandbox Code Playgroud)
和 FILE_B 是这样的:
123456789,123456789,730025400149993,
123455321,123455321,730025400126097,
Run Code Online (Sandbox Code Playgroud)
因此,使用 bash 我有一个 while 循环,它选择 FILE_A 中的下一行,并在 FILE_B 中将其遍历。当在 FILE_B 中找到模式时,我将其写入 result.txt。
while read -r line; do
grep -F -m1 $line 30MFile
done < 300KFile
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助。
该文件的大小为 962,120,335 字节。
HP-UX ******B.11.31 U ia64 ***** 无限制用户许可证
hostname> what /usr/bin/awk
/usr/bin/awk:
main.c $Date: 2009/02/17 15:25:17 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
run.c $Date: 2009/02/17 15:25:20 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
$Revision: @(#) awk R11.31_BL2010_0503_1 PATCH_11.31 PHCO_40052
hostname> what /usr/bin/sed
/usr/bin/sed:
sed0.c $Date: 2008/04/23 11:11:11 $Revision: r11.31/1 PATCH_11.31 (PHCO_38263)
$Revision: @(#) sed R11.31_BL2008_1022_2 PATCH_11.31 PHCO_38263
hostname>perl -v
This is perl, v5.8.8 built for IA64.ARCHREV_0-thread-multi
hostname:> $ file /usr/bin/perl
/usr/bin/perl: ELF-32 executable object file - IA64
hostname:> $ file /usr/bin/awk
/usr/bin/awk: ELF-32 executable …
Run Code Online (Sandbox Code Playgroud) 我在处理巨大的 .gz 文件(大于 500G)时遇到问题。我的目标是通过这些文件中的第 4 个字段拆分这些文件中的每一个。我以前用过这个漂亮的 awk one-liner 来做到这一点:
zcat file.txt.gz | awk 'NR>1{print > $4}'
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这需要很长时间才能处理大文件,所以我试图首先按大小拆分它们,然后在按字段拆分后连接每个文件。我可以使用以下方法拆分它们:
i=file.txt.gz
dir=$i
mkdir -p $dir
cd $dir
split -b 200M ../$i $i
for file in `ls *`; do zcat $file | awk 'NR>1{print > $4}'; done
Run Code Online (Sandbox Code Playgroud)
但是我如何通过第 4 个字段连接所有正确的文件?另外,真的没有更好的方法来做到这一点吗?当我使用这样的 gz 文件拆分时,我也遇到了一个错误,比如“文件意外结束”,所以我想我的拆分也是错误的,但我不确定我是否朝着正确的方向前进,如果你有建议会很有帮助。
非常感谢你的帮忙!弗拉
large-files ×10
files ×3
linux ×3
binary ×2
algorithms ×1
awk ×1
bash ×1
delete ×1
disk-usage ×1
grep ×1
gzip ×1
logrotate ×1
memory ×1
mmap ×1
parallelism ×1
rm ×1
sort ×1
split ×1
syslog-ng ×1