如何从一个非常大的文本文件(98GB)中剪切出1GB的部分?

如何从一个非常大的文本文件(98GB)中剪切出1GB的部分?

我在一夜的测试中成功生成了一个 98GB 的​​日志文件。我无法对 98GB 的​​文件做任何事情。我原本想将其切成更小的部分,所以我尝试了 7-zip,但我的磁盘上实际上没有足够的剩余空间(可能是因为现在有 100GB 的文件......)。所以我只想从末尾截掉 1GB 部分。这可能吗?

它只是一个带有时间戳和一些后续数据的文本文件,我并不关心文件的第一行是否被剪切/损坏。Windows 10 中有什么内置功能我可以使用吗?

答案1

这也可以通过内置 cmdlet 来实现,但我Get-Content对超过 100 MB 的文件运行会持谨慎态度。如果你想尝试,你可能需要相当于tail。我不确定它们是否足够聪明,可以跳过,或者它们是否会尝试从头开始读取每一行并仅显示最后 X 行。显然,如果尝试读取并跳过 90+ GB,后一种方法将需要一段时间。

如果您不关心 Windows 内置的工具,我相信 GNUtail实现更智能。这可以从 WSL 或众多端口之一运行。

坚持使用纯 PowerShell/.NET 脚本,我将采用以前的用于拆分单个大文件的 PowerShell 脚本。此脚本使用 4 kB 块编写,以最大限度地减少内存使用量。我们可以首先寻找到正确的位置(几乎是即时操作)并从那里复制。为简单起见,不解析下一个/上一个线中断已完成;我们只是跳转到特定的字节(甚至是中线)。

如果您希望从开头寻找一定距离,则可以用$seekLoc = 97GB和替换$seekOrigin = "Begin",这样也许$copyLen = 10GB更安全,不会错过结尾。

$inFile = "foo.txt"
$outFile = "bar.txt"
$seekLoc = -1GB
$seekOrigin = "End"
$copyLen = 1GB

# need to sync .NET CurrentDirectory with PowerShell CurrentDirectory
# https://stackoverflow.com/questions/18862716/current-directory-from-a-dll-invoked-from-powershell-wrong
[Environment]::CurrentDirectory = Get-Location
# 4k is a fairly typical and 'safe' chunk size
# partial chunks are handled below
$bytes = New-Object byte[] 4096

$inReader = [System.IO.File]::OpenRead($inFile)
$inReader.Seek($seekLoc, $seekOrigin)

# better to use functions but a flag is easier in a simple script
$finished = $false

$bytesToRead = $copyLen

# Just like File::OpenWrite except CreateNew instead to prevent overwriting existing files
$outWriter = New-Object System.IO.FileStream "$outFile",CreateNew,Write,None

while ($bytesToRead) {
    # read up to 4k at a time, but no more than the remaining bytes from copyLen
    $bytesRead = $inReader.Read($bytes, 0, [Math]::Min($bytes.Length, $bytesToRead))

    # 0 bytes read means we've reached the end of the input file
    if (!$bytesRead) {
        break
    }

    $bytesToRead -= $bytesRead

    $outWriter.Write($bytes, 0, $bytesRead)
}

# dispose closes the stream and releases locks
$outWriter.Dispose()

$inReader.Dispose()

答案2

我已经使用了 V 文件查看器 轻松成功查看如此大的文件。此解决方案不需要太多磁盘空间,查看器速度非常快。

V File Viewer 是试用软件,试用期为 30 天,之后需要支付 20 美元,包括 6 年的免费升级。如果您需要不时分析如此大的文本文件,那么它可能物有所值。我付了钱,认为这是一项很好的投资。

图像

相关内容