【C#编程最佳实践 九】DFS分布式文件系统

简介: 【C#编程最佳实践 九】DFS分布式文件系统

最近在项目中使用到了DFS分布式文件系统,这里搜集一些资料了解一下这个系统以及如何在我的项目里使用。

DFS定义

Microsoft文件分布系统 (Dfs) 是一个网络服务器组件,它能够使你更容易地在网络上查询和管理数据。分布式文件系统是将分布于不同电脑上的文件组合为单一的名称空间,并使得在网络上建立一个单一的、层次化多重文件服务器和服务器共享的工作更为方便的途径。

DFS优势

分布式文件系统(DFS,Distributed File System)使用户更加容易访问和管理物理上跨网络分布的文件。DFS为文件系统提供了单个访问点一个逻辑树结构,通过DFS,用户在访问文件时不需要知道它们的实际物理位置,即分布在多个服务器上的文件在用户面前就如同在网络的同一个位置。通过DFS,可以将同一网络中的不同计算机上的共享文件夹组织起来,形成一个单独的、逻辑的、层次式的共享文件系统。

DFS操作

DFS是一个树状结构,包含一个根目录一个或多个DFS链接

1,要建立DFS共享,必须首先建立DFS根。

2,然后在每一个DFS根下,创建一个或多个DFS链接,每一个链接可以指向网络中的一个共享文件夹。

注意:Dfs链接的最大数目是1000。如果Dfs链接的目标文件夹不是Windows 2000文件夹,则该目标文件夹不能有子文件夹。

DFS实践

对应于项目体系中,dfs在实践的过程中,有以下几个过程

DFS存储

1,第一步:将对象序列化为字符串并压缩

===========================获取对比结果对象=======================
Person p = new  Person();
=========================将该对象序列化为字符串=======================
string serializeStr= Maolin.Common.Serialize.SerializeHelper.Serialize(p);  // 获取序列化的字符串
=========================压缩字符串数据=======================
string str = GZipCompressHelper.GZipCompressString(serializeStr);   //压缩字符串数据

2,第二步,将该压缩字符串转换为二进制数组,进而转换为流对象

byte[] bData = System.Text.Encoding.UTF8.GetBytes(str);  //转换为二进制比特流,以UTF-8的编码样式
MemoryStream ms = new MemoryStream(bData);

MemoryStream类用于向内存而不是磁盘读写数据。MemoryStream封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要

3,第三步,创建文件名,调用方法,将该流对象存储到dfs上,并将dfs对象字符串化后存储到数据库中

var fileName = tenantId + "_" + importLogID.ToString();  //文件名 :租户ID+日志id
 var dfsPath = Dfs.Store(new DfsItem(BaseConst.PublicDfsKeyspace, fileName + ".json", ms, tenantId));  //将文件存到该dfs路径
 CompareToolImportLogProvider.Instance.Create(status, dfsPath.ToString(), createdBy, importLogID);
 //将生成完成后的各项数据存入数据库中

DFS读取

1,第一步:依据id从数据库取出该条数据及其dfspath

===========================读取数据库对象=======================
var compareToolImportLogProvider = CompareToolImportLogProvider.Instance.GetById(id);  //依据日志id拿到该条对比工具的日志记录
=========================从该对象中拿到dfs路径=======================
var dfsPath = compareToolImportLogProvider.DfsPath;  //读取到dfs的路径

2,第二步,将路径直接转换为二进制数组

var item = GetDfsItem(dfsPath);//将dfs路径传入获取二进制数组

用到的辅助方法

/// <summary>
        /// 私有方法:获取二进制数据
        /// </summary>
        /// <param name="dfsPath"></param>
        /// <returns></returns>
        private byte[] GetDfsItem(string dfsPath)
        {
            byte[] fileData = null;
            try
            {
                Dfs.Get(new[] { dfsPath }, (operationResult, item) =>
                {
                    if (!operationResult.Succeeded)
                        return;
                    if (item.IsStream)
                    {
                        fileData = new byte[item.Length];
                        int index = 0;
                        while (index < item.Length)
                        {
                            int read = item.FileDataStream.Read(fileData, index,
                                                                (int)
                                                                (item.Length - index));
                            index += read;
                        }
                    }
                    else
                    {
                        fileData = item.FileDataBytes;
                    }
                });
            }
            catch (Exception ex) { }
            if (fileData == null)
            {
                throw new Maolin.DfsClient.DfsException($"DFS文件不存在.dfsPath:[{dfsPath}]");
            }
            return fileData;
        }

3,第三步,将二进制数组转换为字符串,解压缩,进而反序列化为对象

var str = System.Text.Encoding.UTF8.GetString(item);  //将二进制数组转为字符串
  var strlcm = GZipCompressHelper.GZipDecompressString(str);  //将该字符串解压缩
   var person = Maolin.Common.Serialize.SerializeHelper.Deserialize<Person>(strlcm);//反序列化为实体

这就是一个完整的对象存储到文件系统上并且读取的全过程了,之后如果遇到需要dfs的,相信应该会比较熟练

相关文章
|
8月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
349 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
404 3
|
9月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
1837 0
|
机器学习/深度学习 分布式计算 API
Python 高级编程与实战:深入理解并发编程与分布式系统
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发、API 设计、网络编程和异步IO。本文将深入探讨 Python 在并发编程和分布式系统中的应用,并通过实战项目帮助你掌握这些技术。
|
消息中间件 分布式计算 并行计算
Python 高级编程与实战:构建分布式系统
本文深入探讨了 Python 中的分布式系统,介绍了 ZeroMQ、Celery 和 Dask 等工具的使用方法,并通过实战项目帮助读者掌握这些技术。ZeroMQ 是高性能异步消息库,支持多种通信模式;Celery 是分布式任务队列,支持异步任务执行;Dask 是并行计算库,适用于大规模数据处理。文章结合具体代码示例,帮助读者理解如何使用这些工具构建分布式系统。
|
分布式计算 DataWorks 数据处理
产品测评 | 上手分布式Python计算服务MaxFrame产品最佳实践
MaxFrame是阿里云自研的分布式计算框架,专为大数据处理设计,提供高效便捷的Python开发体验。其主要功能包括Python编程接口、直接利用MaxCompute资源、与MaxCompute Notebook集成及镜像管理功能。本文基于MaxFrame最佳实践,详细介绍了在DataWorks中使用MaxFrame创建数据源、PyODPS节点和MaxFrame会话的过程,并展示了如何通过MaxFrame实现分布式Pandas处理和大语言模型数据处理。测评反馈指出,虽然MaxFrame具备强大的数据处理能力,但在文档细节和新手友好性方面仍有改进空间。
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
1348 12
|
人工智能 分布式计算 数据处理
云产品评测:MaxFrame — 分布式Python计算服务的最佳实践与体验
阿里云推出的MaxFrame是一款高性能分布式计算平台,专为大规模数据处理和AI应用设计。它提供了强大的Python编程接口,支持分布式Pandas操作,显著提升数据处理速度(3-5倍)。MaxFrame在大语言模型数据处理中表现出色,具备高效内存管理和任务调度能力。然而,在开通流程、API文档及功能集成度方面仍有改进空间。总体而言,MaxFrame在易用性和计算效率上具有明显优势,但在开放性和社区支持方面有待加强。
253 9
|
消息中间件 网络协议 C#
C#使用Socket实现分布式事件总线,不依赖第三方MQ
`CodeWF.EventBus.Socket` 是一个轻量级的、基于Socket的分布式事件总线系统,旨在简化分布式架构中的事件通信。它允许进程之间通过发布/订阅模式进行通信,无需依赖外部消息队列服务。
C#使用Socket实现分布式事件总线,不依赖第三方MQ
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
607 2