首页 > 解决方案 > 如何在 iOS 中将大文件块明智地上传到 Azure blob 时减少内存使用量?

问题描述

当我们尝试在 Azure Blob 中上传大文件 (Chunk Wise) 时,我们会在 iOS 中遇到高内存使用问题。下面的代码已用于在 Azure Blob 中上传一个大文件(Chunk Wise)。

func uploadToBlob(_ url: URL) {
            let blobClient = self.account?.getBlobClient()
            let blobContainer = blobClient?.containerReference(fromName: Configure.shared.blobName!)
            let blobBlock = blobContainer?.directoryReference(fromName: blobFolder).subdirectoryReference(fromName: directory).subdirectoryReference(fromName: subDirectory).blockBlobReference(fromName: Date().toUploadFormate+"_"+orgUrl.lastPathComponent)

            let data = NSData(contentsOf: url)!
            let length = data.length
            let chunkSize = 4194304
            var offset = 0
            var blockList : [AZSBlockListItem] = []

            func nextChunk() {
                let thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset
                let chunk = Data(bytesNoCopy: UnsafeMutableRawPointer(mutating: data.bytes+offset), count: thisChunkSize, deallocator: .none)

                offset += thisChunkSize
                let utf8str = UUID().uuidString.data(using: .utf8)
                if let base64EncodedId = utf8str?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) {
                    blockList.append(AZSBlockListItem(blockID: base64EncodedId, blockListMode: .uncommitted))

                    func uploadBlockList() {
                        blobBlock?.uploadBlockList(from: blockList, completionHandler: { (bError) in
                            guard bError == nil else {
                                print(bError!)
                                uploadBlockList()
                                return
                            }
                        })
                    }

                    func uploadBlock() {
                        blobBlock?.uploadBlock(from: chunk, blockID: base64EncodedId, completionHandler: { (error) in
                            guard error == nil else {
                                uploadBlock()
                                return
                            }
                            guard offset >= length else {
                                nextChunk()
                                return
                            }
                            uploadBlockList()
                        })
                    }
                    uploadBlock()
                }
            }
            nextChunk()
        }

这是显示高内存使用问题的图像。

在此处输入图像描述

标签: iosobjective-cswiftazureazure-blob-storage

解决方案


试试@Cy-4AH 提到的这段代码

@IBAction func onReadStream(_ sender: UIButton) {
        guard videoURL != nil else { return }
        guard let inputStream = InputStream(url: videoURL!) else { return }
        do {

            try readingInputStream(reading: inputStream)

        } catch {
            print(error)
        }
    }

    func readingInputStream(reading input: InputStream) throws {
        input.open()
                defer {
                    input.close()
                }

                let bufferSize = 1024
                let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
                defer {
                    buffer.deallocate()
                }
                while input.hasBytesAvailable {
                    let read = input.read(buffer, maxLength: bufferSize)
                    if read < 0 {
                        throw input.streamError!
                    } else if read == 0 {
                        break
                    }
                    let data = Data(bytes: buffer, count: read)
                    print(data)
                    // Here you can upload data to server
                }
    }

推荐阅读