Şu anda bir oluşturma adımının bir parçası olarak TeamCity'de kullanılacak bir PowerShell betiği üzerinde çalışıyorum. Herhangi çoğaltmaları olup olmadığınıPowerShell betiği okuma dosyaları performansı çok yavaş
- yinelemeli (GUID içerir) her dosyanın üçüncü satırını okumak, bir klasör içinde belirli bir uzantıya (.item) ile tüm dosyaları ve check: komut zorundadır bu satırlardaki,
- bir veya daha fazla çiftleri
bulunursa
Write-Host "Start checking for Unicorn serialization errors."
$files = get-childitem "%system.teamcity.build.workingDir%\Sitecore\serialization" -recurse -include *.item | where {! $_.PSIsContainer} | % { $_.FullName }
$arrayOfItemIds = @()
$NrOfFiles = $files.Length
[bool] $FoundDuplicates = 0
Write-Host "There are $NrOfFiles Unicorn item files to check."
foreach ($file in $files)
{
$thirdLineOfFile = (Get-Content $file)[2 .. 2]
if ($arrayOfItemIds -contains $thirdLineOfFile)
{
$FoundDuplicates = 1
$itemId = $thirdLineOfFile.Split(":")[1].Trim()
Write-Host "Duplicate item ID found!"
Write-Host "Item file path: $file"
Write-Host "Detected duplicate ID: $itemId"
Write-Host "-------------"
Write-Host ""
}
else
{
$arrayOfItemIds += $thirdLineOfFile
}
}
if ($foundDuplicates)
{
"##teamcity[buildStatus status='FAILURE' text='One or more duplicate ID's were detected in Sitecore serialised items. Check the build log to see which files and ID's are involved.']"
exit 1
}
Write-Host "End script checking for Unicorn serialization errors."
sorundur: çok yavaş cehennem komut, ama şimdiye kadar ben beklediğiniz bunu yapmak bir şeyi yaptık! Bu betik tarafından kontrol edilmesi gereken klasör şu anda 14.000'den fazla .item dosyası içeriyor ve bu miktarın gelecekte yalnızca artmaya devam etmesi olasıdır. Birçok dosyanın açılmasının ve okunmasının kapsamlı bir işlem olduğunu anlıyorum, ancak bunu tamamlamak için yaklaşık yarım saat sürmesini beklemiyordum. Bu çok uzun, çünkü her (enstantane) yapının yapım süresinin yarım saat kadar uzatılacağı anlamına geliyor, ki bu kabul edilemez. Senaryoyu en fazla birkaç dakika içinde tamamlamayı ummuştum.
Bunu yapmanın daha hızlı bir yaklaşımı olmadığına inanamıyorum. Bu nedenle bu alandaki herhangi bir yardım büyük beğeni topladı!
Çözüm
Eh ben şimdiye kadar alınan tüm 3 cevaplar bunda bana yardımcı oldu söylemek gerekir. İlk olarak .NET framework sınıflarını doğrudan kullanmaya başladım ve daha sonra büyüyen dizi problemini çözmek için sözlüğü de kullandım. Kendi senaryonumu çalıştırmaya harcanan süre yaklaşık 30 dakika oldu, sonra .NET framework sınıflarını kullanarak sadece 2 dakikaya indi. Sözlük çözümünü kullandıktan sonra sadece 6 veya 7 saniyeye indi! Kullandığım son komut dosyası:
Write-Host "Start checking for Unicorn serialization errors."
[String[]] $allFilePaths = [System.IO.Directory]::GetFiles("%system.teamcity.build.workingDir%\Sitecore\serialization", "*.item", "AllDirectories")
$IdsProcessed = New-Object 'system.collections.generic.dictionary[string,string]'
[bool] $FoundDuplicates = 0
$NrOfFiles = $allFilePaths.Length
Write-Host "There are $NrOfFiles Unicorn item files to check."
Write-Host ""
foreach ($filePath in $allFilePaths)
{
[System.IO.StreamReader] $sr = [System.IO.File]::OpenText($filePath)
$unused1 = $sr.ReadLine() #read the first unused line
$unused2 = $sr.ReadLine() #read the second unused line
[string]$thirdLineOfFile = $sr.ReadLine()
$sr.Close()
if ($IdsProcessed.ContainsKey($thirdLineOfFile))
{
$FoundDuplicates = 1
$itemId = $thirdLineOfFile.Split(":")[1].Trim()
$otherFileWithSameId = $IdsProcessed[$thirdLineOfFile]
Write-Host "---------------"
Write-Host "Duplicate item ID found!"
Write-Host "Detected duplicate ID: $itemId"
Write-Host "Item file path 1: $filePath"
Write-Host "Item file path 2: $otherFileWithSameId"
Write-Host "---------------"
Write-Host ""
}
else
{
$IdsProcessed.Add($thirdLineOfFile, $filePath)
}
}
if ($foundDuplicates)
{
"##teamcity[buildStatus status='FAILURE' text='One or more duplicate ID|'s were detected in Sitecore serialised items. Check the build log to see which files and ID|'s are involved.']"
exit 1
}
Write-Host "End script checking for Unicorn serialization errors. No duplicate ID's were found."
Herkese teşekkürler!
Muhtemelen burada IO-bant genişliği sınırlıdır. Bu nedenle, büyük miktarda zaman (muhtemelen) diskten dosyaları sürüklemede kullanılıyor. Eğer durum buysa (ve zarf hesabının arkası bunu teyit edebilmelidir), o zaman bunu hızlandırmanın en kolay yolu daha hızlı depolamaya geçmek (SSD gibi) olacaktır. –
@Mike Wise: 14000 dosyanın kopyalanması için yarım saat bile herhangi bir modern makinede aşırı olabilirdi. Sanırım bu dosyada IO bir sorun değil. Onun kodu "bir inşa adımının bir parçası" olduğu için, tüm dosyalar kod başlatılmadan hemen önce ele alınacak veya oluşturulacak ve muhtemelen disk önbelleğinde yer alacaktır. –