NTFS 上的硬链接目录似乎占用了比应有的更多的空间

NTFS 上的硬链接目录似乎占用了比应有的更多的空间

Windows 2008 R2 和 Windows 7 Ultimate 都表现出这种行为......

所以我有像这样的目录结构......YEAR\MONTH\file_x.ext,其中YEAR 可以追溯到 2007 年,每个 MONTH 目录包含数百到数千个(目前最多 2500 个)文件。

我有一个程序可以随机选择一个文件进行处理,但它只适用于单个目录。因此,我创建了一个新目录,并在其中为我的结构中的每个文件(超过 40,000 个)创建了一个硬链接。

一切运行顺利,但现在 Explorer 报告磁盘只剩下几 MB 的可用空间,并且拒绝允许将任何其他数据写入磁盘。

因为它们是硬链接,所以我估计磁盘上应该还剩余大约 40GB 的可用空间。

关于如何解决这个问题有什么想法吗?(例如,允许单目录应用程序正常运行,同时仍保留组织结构,并且不会使磁盘空间使用量加倍)

答案1

你确定是硬链接占满了你的磁盘吗?我在这里测试过,但无法重现。

理论上CreateHardLink应该等同于mklink /h命令;但为了以防万一,我创建了以下 AutoIt 脚本以确保我使用的函数调用与您相同。(我太懒了,不想用 VC++ 编写代码……)

#include <WinAPI.au3>
#include <WinAPIError.au3>

Local $kernel = DllOpen("kernel32.dll")

If $CmdLine[0] <> 2 Then
   ConsoleWriteError("usage: CreateHardLink Link Target" & @CRLF)
   Exit
EndIf

Local $result = DllCall($kernel, "BOOL", "CreateHardLink", "str", $CmdLine[1], "str", $CmdLine[2], "LONG_PTR", 0)
If $result[0] == 0 Then
   ConsoleWriteError("Windows error " & _WinAPI_GetLastError() & ": " & _WinAPI_GetLastErrorMessage())
Else
   ConsoleWrite("Hardlink created for " & $CmdLine[1] & " <<===>> " & $CmdLine[2] & @CRLF)
EndIf

然后我在 VMware 中创建了一个单独的 2.0GB 磁盘并将其连接起来,这样测试就不会与页面文件等位于同一磁盘上。

测试 #1:创建一个具有 1024 个硬链接的文件(1023 + 原始文件):

我将一个文件放在根目录中,并使用以下批处理文件为其创建了另外 1023 个链接(支持的最大数量):

@echo off
dir | find "(s)"
for /l %%i in (0,1,1023) do C:CreateHardLink.exe %%i %1
dir | find "(s)"

之前的磁盘使用情况:

           1 File(s)      3,212,078 bytes
           0 Dir(s)   2,089,775,104 bytes free

之后的磁盘使用情况:

        1024 File(s)  3,289,167,872 bytes
           0 Dir(s)   2,089,222,144 bytes free

Explorer 显示 1.99 GB 中还剩余 1.94GB 可用。

测试 #2:许多文件,全部链接到同一个目录(您的情况):

我将大约 1.08GB 的​​数据(各种大小的文件中,位于不同的目录中)复制到该分区,并为找到的每个文件创建一个硬链接,指向名为 HardLinks 的目录。该批处理文件:

@echo off
setlocal
setlocal enabledelayedexpansion
dir /s | find "(s)"
set /a i=0
for /r %%a in (*) do (
        C:CreateHardLink "HardLinks\!i!_%%~nxa" "%%~a"
        set /a i=!i!+1
)
dir /s | find "(s)"

之前的磁盘使用情况:

        2034 File(s)  1,109,324,978 bytes
        1998 Dir(s)     975,511,552 bytes free

之后的磁盘使用情况:

        4246 File(s)  2,490,368,854 bytes
        1998 Dir(s)     973,955,072 bytes free

如果没有硬链接,这在物理上是不可能的,因为我的磁盘只有 2.0GB。

磁盘空间确实减少了 1520K,即每个创建的硬链接约 1.46K。按照这个速度,要消耗 40GB 的硬链接元数据,您需要大约 2900 万个硬链接。(我想到那时您会遇到另一个限制,例如单个目录中的文件条目数量。;-)

抱歉,这本身并不是一个好的“答案”;但希望它能让您放心,硬链接不应该填满您的磁盘。如果我是您,我会以较小的批次创建更多硬链接,并测量前后的磁盘空间使用情况。查看同一磁盘上的其他内容是否占用了比应有的更多的空间也可能是值得的。

我真的想不出为您准备的替代解决方案;硬链接似乎非常适合这种情况,不是吗?

相关内容