.net (Amazon.S3.IO.S3FileInfo+;Powershell+;File>;1gb)=Boom

.net (Amazon.S3.IO.S3FileInfo+;Powershell+;File>;1gb)=Boom,.net,file-io,amazon-s3,powershell-3.0,.net,File Io,Amazon S3,Powershell 3.0,我正在尝试将文件上载到AmazonS3。只要文件大小不超过1GB,就可以正常工作。 如果是这样,Powershell在处理1GB之后的第1个字节时会遇到一些内存循环,并且永远无法写入主机行 我只是不明白为什么会有限制,以及如何处理。有什么想法吗 (下面的代码片段打开了一个文件流读取器+写入器。在我的家用计算机上,此函数的实际代码包含一个额外的加密流写入器,为了代码的可读性,我在这里删除了该加密流写入器,以防有人想知道代码的用途。但结果是相同的->内存循环) 对于大型文件,使用写入流的操作不太有效

我正在尝试将文件上载到AmazonS3。只要文件大小不超过1GB,就可以正常工作。 如果是这样,Powershell在处理1GB之后的第1个字节时会遇到一些内存循环,并且永远无法写入主机行 我只是不明白为什么会有限制,以及如何处理。有什么想法吗

(下面的代码片段打开了一个文件流读取器+写入器。在我的家用计算机上,此函数的实际代码包含一个额外的加密流写入器,为了代码的可读性,我在这里删除了该加密流写入器,以防有人想知道代码的用途。但结果是相同的->内存循环)

对于大型文件,使用写入流的操作不太有效。计算到S3的签名需要所有数据,因此S3FileInfo会缓冲写入其流的数据,直到流关闭

我建议使用并使用
Upload(stream,bucketName,key)
方法,该方法接收您的流,有关详细信息和示例片段,请参阅


由于您使用的是加密流,您可能需要查看添加到SDK版本2的S3加密支持,请参阅。

感谢Norm的回答,我想我必须在这里重新编写代码。
function S3Upload()
{
   $FileStreamWriter = (New-Object Amazon.S3.IO.S3FileInfo($S3Client, $BucketName, $key)).OpenWrite()  
   $FileStreamReader = New-Object System.IO.FileStream($SourceFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)    

  [int16]$Bytes2read = 16
  [Byte[]]$Data  = New-Object Byte[] 16
  Do{      
     $Count   = $FileStreamReader.Read($Data, 0, $Bytes2read)
     $FileStreamWriter.Write($Data, 0, $Count)    
    }
  While ($Count -gt 0)

  write-host "Closing Streams"
  $FileStreamReader.Close()
  $FileStreamWriter.Close() 
}