Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure Storage BufferManager做什么,如何/何时实施?_Azure_Garbage Collection_Azure Storage_Azure Table Storage_Buffer Manager - Fatal编程技术网

Azure Storage BufferManager做什么,如何/何时实施?

Azure Storage BufferManager做什么,如何/何时实施?,azure,garbage-collection,azure-storage,azure-table-storage,buffer-manager,Azure,Garbage Collection,Azure Storage,Azure Table Storage,Buffer Manager,有关MSDN for的文档介绍了此缓冲区管理器可提高高规模应用程序的性能 我的理解是,这个缓冲区管理器减少了许多小型事务对GC的压力(在许多Azure表实体调用中都会出现这种情况) 然后,我阅读了一篇关于桌面使用的参考资料,而桌面/移动设备使用概况似乎不太可能遇到GC碎片: IBufferManager接口以System.ServiceModel.dll中的BufferManager类为模式,允许桌面客户端轻松利用框架提供的现有实现 问题 IBufferManager的唯一目的是降低GC的压力吗

有关MSDN for的文档介绍了此缓冲区管理器可提高高规模应用程序的性能

我的理解是,这个缓冲区管理器减少了许多小型事务对GC的压力(在许多Azure表实体调用中都会出现这种情况)

然后,我阅读了一篇关于桌面使用的参考资料,而桌面/移动设备使用概况似乎不太可能遇到GC碎片:

IBufferManager接口以System.ServiceModel.dll中的BufferManager类为模式,允许桌面客户端轻松利用框架提供的现有实现

问题

  • IBufferManager的唯一目的是降低GC的压力吗

  • 哪些工作负载(表、队列、Blob)将受益于此缓存

  • 我应该在哪些(可测量的)条件下实施IBufferManager

  • BufferManager是线程安全的吗?我可以根据需要分配一个运行时服务器端缓冲池吗

  • 我应该/不应该如何实现这个缓冲区管理器?(例如线程、IDisposable、静态方法中的预分配、Redis)

  • @拉蒙特克里斯托, 这些都是好问题

    IBufferManager的唯一目的是降低GC的压力吗

    BufferManager不仅可以减轻GC的压力,还可以提高存储服务器的性能。GC可以创建和销毁缓冲池,这些过程是计算机资源上每次分配的成本。BufferManager可以保留缓冲池,并且每次都比GC快。同时,我建议你可以参考这个

    哪些工作负载(表、队列、Blob)将受益于此缓存

    答案是肯定的。Azure storage SDK为这3种存储服务提供了此功能。它们是相同的方法

    我应该在哪些(可测量的)条件下实施IBufferManager

    理论上,我们可以使用不同的MaxBufferSize进行并发请求,以获得服务器响应时间。然后再次发送这些请求以再次获得响应时间。我们可以比较这两个响应时间。实际上,这是时间和记忆之间的平衡

    BufferManager是线程安全的吗?我可以根据需要分配一个运行时服务器端缓冲池吗

    根据我的经验,如果我们在多个线程中使用同一个实例,那么它不是线程安全的。请参阅本文件(安全)

    我应该/不应该如何实现这个缓冲区管理器?(例如线程、IDisposable、静态方法中的预分配、Redis)

    您需要在项目中实现“
    System.ServiceModel
    ”,并尝试使用以下示例:

    public class WCFBufferManagerAdapter : IBufferManager
    {
        private int defaultBufferSize = 0;
    
        public WCFBufferManagerAdapter(BufferManager manager, int defaultBufferSize)
        {
            this.Manager = manager;
            this.defaultBufferSize = defaultBufferSize;
        }
    
        public BufferManager Manager { get; internal set; }
    
        public void ReturnBuffer(byte[] buffer)
        {
            this.Manager.ReturnBuffer(buffer);
        }
    
        public byte[] TakeBuffer(int bufferSize)
        {
            return this.Manager.TakeBuffer(bufferSize);
        }
    
        public int GetDefaultBufferSize()
        {
            return this.defaultBufferSize;
        }
    }
    
    然后可以按如下方式使用此BufferManager:

    StorageCredentials credentials = new StorageCredentials("**", "**");
                CloudBlobClient serviceClient = new CloudBlobClient(new Uri("**"), credentials);             
                BufferManager mgr = BufferManager.CreateBufferManager(<you_can_set>, <you_can_set>);            
                serviceClient.BufferManager = new WCFBufferManagerAdapter(mgr, <you_can_set>);
                serviceClient.GetContainerReference("**");
    
    StorageCredentials credentials=新的StorageCredentials(“**”和“**”);
    CloudBlobClient serviceClient=新的CloudBlobClient(新Uri(“**”),凭证);
    BufferManager mgr=BufferManager.CreateBufferManager(,);
    serviceClient.BufferManager=新的wcfBufferManagerDatapter(mgr,);
    serviceClient.GetContainerReference(**);
    
    如果要使用多个线程,可能需要在代码中使用“锁定”。 如果有任何问题,请告诉我