问题描述
因此,我正在尝试创建一个 powershell 脚本,该脚本使用各种大小的文件“基准化”GPG 的速度。给我带来麻烦的具体部分是:
1 $temppath="$($env:Temp)\"
...
4 Measure-Command {$bytes= 10000MB
5 [System.Security.Cryptography.RNGCryptoServiceProvider]$rng = New- Object.System.Security.Cryptography.RNGCryptoServiceProvider
6 $rndbytes = New-Object byte[] $bytes
7 [System.Io.File]::WriteallBytes("$($temppath)\test.txt",$rndbytes)} | Select-Object -Outvariable gentime | Out-Null;
当 $bytes >~ 1.5GB
(我使用 10000MB 来测试它)时,我收到一个错误,如果我正确理解发生了什么,对应于字节数组由类型为 { 的变量索引的事实{1}}。具体错误是这样的:
int32
有没有办法强制powershell在创建对象时索引$rndbytes,索引类型为New-Object : Cannot convert argument "0",with value: "10485760000",for "Byte[]" to type "system.int32": "Cannot convert value "10485760000" to type "system.int32". Error: "Value was either too large or too small for an Int32.""
At line:6 char:13
+ $rndbytes = New-Object byte[] $bytes
+ CategoryInfo : InvalidOperation: (:) [New-Object],MethodException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
或int64
?如果这不是问题,我很乐意看到并解释到底出了什么问题。
请注意,如果您使用例如 uint64
(或编写 $bytes=1000MB
),则代码完美运行。我怀疑我在 $bytes=1GB
左右碰壁了。
多谢帮助~!!
解决方法
如评论中所述,.NET 中的数组长度不能超过 2^31-1 项,因为用于数组的索引值为 [int]
- 其中最大值为 2^31-1。
这不是一个真正的问题,因为在内存中缓冲 20 亿个项目无论如何都是非常低效的——如果你想要 10GB 的随机数据,你可以块生成并写入磁盘。 em> 代替:
# Set file size
$intendedSize = 10GB
# Create output buffer
$buffer = [byte[]]::new(4KB)
# Create RNG
$rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::Create()
# Create temp file,open writable filestrem
$tempFile = [System.IO.Path]::GetTempFileName() |Get-Item
$fileStream = $tempFile.OpenWrite()
do {
# Fill buffer,write to disk,rinse-repeat
$rng.GetBytes($buffer)
$fileStream.Write($buffer,$buffer.Length)
} while($fileStream.Length -lt $intendedSize)
# Dispose if filestream + RNG
$fileStream.Dispose()
$rng.Dispose()
4KB
在 Windows 上通常是一个很好的通用缓冲区大小,因为 4KB 是 NTFS 卷上的默认集群大小,而且大多数现代 CPU 的 L1 缓存大小可以被 4KB 整除