Каталог жестких ссылок в NTFS, кажется, занимает больше места, чем следует
Windows 2008 R2 и Windows 7 Ultimate демонстрируют такое поведение...
Итак, у меня есть структура каталогов, такая как... YEAR\MONTH\file_x.ext, где YEAR восходит к 2007 году, и каждый каталог MONTH содержит от сотен до тысяч (2500 макс. Сейчас) файлов.
У меня есть программа, которая будет случайным образом выбирать файл для работы, но он работает только на один каталог. Поэтому я создал новый каталог и создал жесткую ссылку для каждого файла в моей структуре (более 40 000).
Все работает безупречно, за исключением того, что теперь Explorer сообщает, что на диске осталось всего несколько МБ свободного места, и отказывается допускать запись дополнительных данных на диск.
Поскольку это жесткие ссылки, я полагаю, что на диске должно быть около 40 ГБ свободного места.
Есть мысли о том, как это решить? (например, позволить приложению с одним каталогом работать должным образом, сохраняя при этом организованную структуру и не удваивая использование дискового пространства)
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
Затем я создал отдельный диск 2,0 ГБ в VMware и подключил его, чтобы тесты не были на том же диске, что и файл подкачки и т. Д.
Тест № 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
И Исследователь говорит, что 1,94 ГБ свободно от 1,99.
Тест № 2: Многие файлы, все связаны с одним каталогом (ваш случай):
Я скопировал около 1,08 ГБ данных (в файлах разных размеров и в разных каталогах) в раздел и создал одну жесткую ссылку для каждого найденного файла в каталог с именем 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,0 ГБ.
Дисковое пространство действительно уменьшилось ровно на 1520 КБ, что составляет ~1,46 КБ на каждую созданную жесткую ссылку. В таком случае, чтобы использовать 40 ГБ только для метаданных жестких ссылок, вам потребуется около 29 миллионов из них. (Я полагаю, что к этому моменту вы столкнетесь с другим ограничением, таким как количество записей в одном каталоге.;-)
Извиняюсь, что это не очень хороший "ответ" как таковой; но, надеюсь, это дает вам некоторую уверенность в том, что нет, жесткие ссылки не должны заполнять ваш диск. На вашем месте я бы создал более жесткие ссылки небольшими партиями и измерил бы использование дискового пространства до и после. Возможно, стоит также посмотреть, занимает ли что-то еще на том же диске больше места, чем должно быть.
Я также не могу придумать альтернативное решение для вас; жесткие ссылки кажутся идеальными для этого случая, не так ли?