首页 文章 精选 留言 我的

精选列表

搜索[读写分离],共10005篇文章
优秀的个人博客,低调大师

TensorFlow读写数据

前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零开始学TensorFlow【01-搭建环境、HelloWorld篇】 什么是TensorFlow? 众所周知,要训练出一个模型,首先我们得有数据。我们第一个例子中,直接使用dataset的api去加载mnist的数据。(minst的数据要么我们是提前下载好,放在对应的目录上,要么就根据他给的url直接从网上下载)。 一般来说,我们使用TensorFlow是从TFRecord文件中读取数据的。 TFRecord 文件格式是一种面向记录的简单二进制格式,很多 TensorFlow 应用采用此格式来训练数据 所以,这篇文章来聊聊怎么读取TFRecord文件的数据。 一、入门对数据集的数据进行读和

优秀的个人博客,低调大师

C#读写Excel

读 Range ce=sheet.Cells[2,3]; string vv=ce.value; 写 //注意: // * Excel中形如Cells[x][y]的写法,前面的数字是RowIndex,后面的数字是ColumnIndex! // * Excel中的行、列都是从1开始的,而不是0 //1.制作一个新的Excel文档实例 Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();//创建excel Workbook myWorkBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);//创建工作簿(workBook;即excel文件主体本身) //Worksheet sheet = (Worksheet)workBook.Worksheets[1];//创建主工作簿 //增加查询信息Sheet // Microsoft.Office.Interop.Excel.Worksheet sarchInfoSheet = myWorkBook.Sheets.Add(); sarchInfoSheet.Name = "查询条件";//确定sheet名称 sarchInfoSheet.Cells[1, 1] = "起始时间:";//起始时间 sarchInfoSheet.Cells[1, 2] = SearchPageModel.mySearchPageModel.startDateTime.ToString();//起始时间 sarchInfoSheet.Cells[2, 1] = "结束时间:";//结束时间 sarchInfoSheet.Cells[2, 2] = SearchPageModel.mySearchPageModel.endDateTime.ToString();//结束时间 sarchInfoSheet.Cells[3, 1] = "手机型号:"; sarchInfoSheet.Cells[3, 2] = SearchPageModel.mySearchPageModel.selectedModel; sarchInfoSheet.Cells[4, 1] = "测试计划:"; sarchInfoSheet.Cells[4, 2] = SearchPageModel.mySearchPageModel.selectedFile; sarchInfoSheet.Cells[5, 1] = "失败项目:"; sarchInfoSheet.Cells[5, 2] = SearchPageModel.mySearchPageModel.selectedItem; sarchInfoSheet.Cells[6, 1] = "失败原因:"; sarchInfoSheet.Cells[6, 2] = SearchPageModel.mySearchPageModel.selectedReason; sarchInfoSheet.Cells[7, 1] = "PhoneID:"; sarchInfoSheet.Cells[7, 2] = SearchPageModel.mySearchPageModel.phoneID; sarchInfoSheet.Cells[8, 1] = "工位IP:"; sarchInfoSheet.Cells[8, 2] = SearchPageModel.mySearchPageModel.computerIP; sarchInfoSheet.Cells[9, 1] = "计算机名:"; sarchInfoSheet.Cells[9, 2] = SearchPageModel.mySearchPageModel.computerName; sarchInfoSheet.Cells[10, 1] = "线程号码:"; sarchInfoSheet.Cells[10, 2] = SearchPageModel.mySearchPageModel.threadNumber; sarchInfoSheet.Cells[11, 1] = "操作人员:"; sarchInfoSheet.Cells[11, 2] = SearchPageModel.mySearchPageModel.tsOperator; sarchInfoSheet.Cells[12, 1] = "测试类型:"; sarchInfoSheet.Cells[12, 2] = SearchPageModel.mySearchPageModel.testType; sarchInfoSheet.Cells[13, 1] = "软件版本:"; sarchInfoSheet.Cells[13, 2] = SearchPageModel.mySearchPageModel.softVersion; sarchInfoSheet.Cells[14, 1] = "测试OK:"; sarchInfoSheet.Cells[14, 2] = SearchPageModel.mySearchPageModel.testResultOK; sarchInfoSheet.Cells[15, 1] = "测试NG:"; sarchInfoSheet.Cells[15, 2] = SearchPageModel.mySearchPageModel.testResultNG; sarchInfoSheet.Cells[16, 1] = "Data is exported from HustAnalyser."; // Worksheet myWorkSheet = myWorkBook.Sheets.Add(); //2.设置Excel分页卡标题 myWorkSheet.Name = "详细数据";//确定sheet名称 //方法二:生成Excel中列头名称 for (int i = 0; i < dataSouce.Columns.Count; i++) { myWorkSheet.Cells[1, i + 1] = dataSouce.Columns[i].ColumnName;//输出DataGridView列头名 if (i>= addCollumNum && searchResults[i - addCollumNum].result == "FAIL") { Microsoft.Office.Interop.Excel.Range columnRange = myWorkSheet.Columns.EntireColumn[i + 1]; columnRange.Font.Color = 0x0000FF;//(蓝00绿00红00) } } //RunInfo = "testDataArray复制数据到Excel"; //方法二:整体赋值 Microsoft.Office.Interop.Excel.Range dataSourceRange = myWorkSheet.Range[myWorkSheet.Cells[2, 1], myWorkSheet.Cells[dataSouce.Rows.Count + 1, dataSouce.Columns.Count]]; dataSourceRange.Value = testDataArray; //给Exccel中的Range整体赋值 //RunInfo = "Excel格式设置..."; dataSourceRange.EntireColumn.AutoFit(); //设定Excel列宽度自适应 //5.设置格式 Microsoft.Office.Interop.Excel.Range rowRange = myWorkSheet.Rows.EntireRow[1];//首行 rowRange.Font.ColorIndex = ColorIndex.深蓝;//首行颜色 rowRange.Interior.Color = 0xA6AA00;//(蓝A6绿AA红00) 首行背景 rowRange.Font.Bold = true;//首行加粗 Microsoft.Office.Interop.Excel.Range colRange = myWorkSheet.Columns.EntireColumn[1];//首列 //colRange.Font.ColorIndex = ColorIndex.深蓝;//首列颜色 colRange.Font.Bold = true;//首列加粗 //冻结首行首列 excelApp.ActiveWindow.SplitRow = 1;//设置将指定窗口拆分成窗格处的行号(拆分线以上的行数) excelApp.ActiveWindow.SplitColumn = 1;//设置将指定窗口拆分成窗格处的列号(拆分线左侧的列数) excelApp.ActiveWindow.FreezePanes = true;//冻结首行首列 //边框实线 Microsoft.Office.Interop.Excel.Range dataRange = myWorkSheet.Range[myWorkSheet.Cells[1, 1], myWorkSheet.Cells[dataSouce.Rows.Count, dataSouce.Columns.Count]];// dataRange.Borders.LineStyle = 1;//设置边框为实线 //myWorkSheet.Cells.Borders.LineStyle = 1;//设置整个数据区边框为实线 //auto adjust column width (according to content)调整列宽 //Microsoft.Office.Interop.Excel.Range allColumn = myWorkSheet.Columns; //allColumn.AutoFit();//调整列宽 dispatcher.Invoke(new System.Action(() => { //以下为Excel保存过程----------------------------- string excelFile = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\HustAnalyser导出info" + DateTime.Now.ToString("-yyyyMMddHHmmss") + ".xlsx"; //默认桌面 System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog(); saveFileDialog.Filter = "Excel文件(*.xlsx)|*.xlsx"; saveFileDialog.FileName = "HustAnalyser导出info" + DateTime.Now.ToString("-yyyyMMddHHmmss"); if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { excelFile = saveFileDialog.FileName; } //myWorkBook.Save();//保存结果 myWorkBook.SaveAs(excelFile);//保存结果 excelApp.Quit(); excelApp = null; System.Diagnostics.Process.Start("Explorer", "/select," + excelFile); //Excel保存结束------------------------------------ }));

优秀的个人博客,低调大师

Android Jxl读写Excel

Jxl 包下载 Android Studio 依赖 compile 'net.sourceforge.jexcelapi:jxl:2.6.12' 本测试在Exlipse中, 由于Jxl的跨平台性。 创建Excel表 /** * 创建Excel * Created by mazaiting on 2017/9/28. */ public class WriteExcel { /**Sheet表, Excel表中的底部的表名*/ private WritableSheet mWritableSheet; /**Excel工作簿*/ private WritableWorkbook mWritableWorkbook; public static void main(String[] args) throws WriteException, IOException { WriteExcel excel = new WriteExcel(); excel.create("test"); for (int i = 0; i < 10; i++) { excel.addString(0, i, "text"+i); excel.addString(1, i, "text"+i+"-1"); excel.addString(2, i, "text"+i+"-2"); } excel.close(); } /** * 创建Sheet表 * @param fileName 文件名 * @return Sheet表 */ public WritableSheet create(String fileName){ try { // 输出Excel的路径 String filePath = "E:/"+fileName+".xls"; // 新建一个文件 OutputStream os = new FileOutputStream(filePath); // 创建Excel工作簿 mWritableWorkbook = Workbook.createWorkbook(os); // 创建Sheet表 mWritableSheet = mWritableWorkbook.createSheet("第一张工作表", 0); return mWritableSheet; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 关闭工作簿 * @throws IOException * @throws WriteException */ public void close() throws IOException, WriteException { // 写入数据 mWritableWorkbook.write(); // 关闭文件 mWritableWorkbook.close(); } /** * 添加字符串 * @param col 列号 * @param row 行号 * @param text 文本 * @throws WriteException */ public void addString(int col, int row, String text) throws WriteException { if (null == mWritableSheet) return; Label label = new Label(col, row, text); mWritableSheet.addCell(label); } /** * 添加数字 * @param col 列号 * @param row 行号 * @param num 数字 * @throws WriteException */ public void addInt(int col, int row, int num) throws WriteException { if (null == mWritableSheet) return; Number number = new Number(col, row, num); mWritableSheet.addCell(number); } } 读取Excel表 /** * 读取Excel */ public class ReadExcel { public static void main(String[] args) { // 字符列表 List<String> list = new ArrayList<String>(); // 文件路径 String filePath = "E:/test.xls"; // 输入流 InputStream is = null; // Excel工作簿 Workbook workbook = null; try { // 加载Excel文件 is = new FileInputStream(filePath); // 获取workbook workbook = Workbook.getWorkbook(is); } catch (Exception e) {} // 获取sheet, 如果你的workbook里有多个sheet可以利用workbook.getSheets()方法来得到所有的 Sheet sheet = workbook.getSheet(0);// 这里只取得第一个sheet的值,默认从0开始 System.out.println(sheet.getColumns());// 查看sheet的列 System.out.println(sheet.getRows());// 查看sheet的行 Cell cell = null;// 单个单元格 // 开始循环,取得cell里的内容,按具体类型来取 // 这里只取String类型 for (int j = 0;j<sheet.getColumns();j++){ StringBuffer sb = new StringBuffer(); for (int i=0;i<sheet.getRows();i++){ // 列,行 cell = sheet.getCell(j, i); sb.append(cell.getContents());// 获取单元格内容 sb.append(",");// 将单元格的每行内容用逗号隔开 } list.add(sb.toString());//将每行的字符串用一个String类型的集合保存。 } workbook.close();// 关闭工作簿 // 迭代集合查看每行的数据 for (String ss : list){ System.out.println(ss); } } }

优秀的个人博客,低调大师

Hadoop数据读写原理

数据流 MapReduce作业(job)是客户端执行的单位:它包括输入数据、MapReduce程序和配置信息。Hadoop把输入数据划分成等长的小数据发送到MapReduce,称之为输入分片。Hadoop为每个分片创建一个map任务,由它来运行用户自定义的map函数来分析每个分片中的记录。 这里分片的大小,如果分片太小,那么管理分片的总时间和map任务创建的总时间将决定作业的执行的总时间。对于大数据作业来说,一个理想的分片大小往往是一个HDFS块的大小,默认是64MB(可以通过配置文件指定) map任务的执行节点和输入数据的存储节点是同一节点时,Hadoop的性能达到最佳。这就是为什么最佳分片的大小与块大小相同,它是最大的可保证存储在单个节点上的数据量如果分区跨越两个块,那么对于任何一个HDFS节点而言,基本不可能同时存储着两数据块,因此此分布的某部分必须通过网络传输到节点,这与使用本地数据运行map任务相比,显然效率很低。 reduce任务并不具备数据本地读取的优势,一个单一的reduce的任务的输入往往来自于所有mapper的输出。因此,有序map的输出必须通过网络传输到reduce任务运行的节点,并在哪里进行合并,然后传递到用户自定义的reduce函数中。 一般情况下,多个reduce任务的数据流成为"shuffle",因为每个reduce任务的输入都由许多map任务来提供。 Hadoop流 流适用于文字处理,在文本模式下使用时,它有一个面向行的数据视图。map的输入数据把标准输入流传输到map函数,其中是一行一行的传输,然后再把行写入标准输出。该框架调用mapper的map()方法来处理读入的每条记录,然而map程序可以决定如何处理输入流,可以轻松地读取和同一时间处理多行,用户的java map实现是压栈记录,但它仍可以考虑处理多行,具体做法是将mapper中实例变量中之前的行汇聚在一起(可用其他语言实现)。 HDFS的设计 HDFS是为以流式数据访问模式存储超大文件而设计的文件系统,在商用硬件的集群上运行。 流式数据访问:一次写入、多次读取模式是最高效的,一个数据集通常由数据源生成或复制,接着在此基础上进行各种各样的分析。 低延迟数据访问:需要低延迟访问数据在毫秒范围内的应用不适用于HDFS,HDFS是为达到高数据吞吐量而优化的,这有可能会以延迟为代价。(低延迟访问可以参考HBASE) 大量的小文件:namenode存储着文件系统的元数据,文件数量的限制也由namenode的内存量决定。每个文件,索引目录以及块占大约150个字节,因此,如果有一百万文件,每个文件占一个块,就至少需要300MB的内存。 多用户写入,任意修改文件:HDFS中的文件只有一个写入者。 HDFS的块比磁盘的块大,目的是为了减少寻址的开销。通过让一个块足够大,从磁盘转移数据的时间能够远远大于定位这个开始端的时间。因此,传送一个由多个块组成的文件的时间就取决于磁盘传送率。 文件读取与写入 HDFS中读取数据 客户端是通过调用fileSystem对象的open()来读取希望打开的文件的。对于HDFS,这个对象是分布式文件系统的一个实例。 (1)DistributedFileSystem通过使用RPC来调用namenode,以确定文件开头部分的块的位置,对于每一个块,namenode返回具有该块副本的数据节点地址。随后这些数据节点根据它们与客户端的距离来排序,如果该客户端本身就是一个数据节点,便从本地数据节点读取。(Distributed FileSystem返回一个FSData InputStream转而包装了一个DFSInputStream对象) (2)存储着文件开头部分的块的数据节点地址的DFSInputStream随机与这些块的最近的数据节点相连接,通过在数据流中重复调用read(),数据就会从数据节点返回客户端。到达块的末端时,DFSInputSteam会关闭与数据节点间的连接,然后为下一个块找到最佳的数据节点。 (3)客户端从流中读取数据时,块是按照DFSInputStream打开与数据节点的新连接的顺序读取的。它也会调用namenode来检索下一组需要的块的数据节点的位置。一旦客户端完成读取,就对文件系统数据输入调用close()。 这个设计的重点是,客户端直接联系数据节点去检索数据,通过namenode指引到每个块中最好的数据节点。因为数据流动在此集群中是在所有数据节点分散进行的,因此这种设计能使HDFS可扩展到最大的并发客户端数量。namenode提供块位置请求,其数据是存储在内存,非常的高效。 文件写入 客户端是通过在DistributedFilesystem中调用create()来创建文件,DistributedFilesystem一个RPC去调用namenode,在文件系统的命名空间中创建一个新文件。namenode执行各种不同的检查以确保这个文件不会已经存在,并且客户端有创建文件的权限。文件系统数据输出流控制一个DFSoutPutstream,负责datanode与namenode之间的通信。 客户端完成数据的写入后,会在流中调用clouse(),在向namenode发送完信息之前,此方法会将余下的所有包放入datanode管线并等待确认,namenode节点已经知道文件由哪些块组成(通过Data streamer询问块分配),所以它值需在返回成功前等待块进行最小量的复制。 一旦写入的数据超过一个块的数据,新的读取者就能看见第一个块,对于之后的块也是这样。总之,它始终是当前正在被写入的块,其他读取者是看不见的。HDFS提供一个方法来强制所有的缓存与datanode同步,即在文件系统数据输出流调用sync()方法,在syno()返回成功后,HDFS能保证文件中直至写入的最后的数据对所有新的读取者而言,都是可见且一致的。万一发生冲突(与客户端或HDFS),也不会造成数据丢失。 应用设计的重要性:如果不调用sync(),那么一旦客户端或系统发生故障,就可能失去一个块的数据,应该在适当的地方调用sync(). 通过distcp进行并行复制:Hadoop有一个叫distcp(分布式复制)的有用程序,能从Hadoop的文件系统并行复制大量数据。如果集群在Hadoop的同一版本上运行,就适合使用hdfs方案: hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar 将从第一个集群中复制/foo目录到第二个集群中的/bar目录下 参考:《Hadoop权威指南-第四版》

优秀的个人博客,低调大师

Hadoop核心-HDFS读写流程

HDFS写数据步骤: 1. client发起文件上传请求,通过RPC与NameNode建立连接,NameNode检查目标文件是否已经存在,父目录是否存在,并检查用户是否有相应的权限,若检查通过, 会为该文件创建一个新的记录,否则的话文件创建失败,客户端得到异常信息, 2. client通过请求NameNode,第一个block应该传输到哪些DataNode服务器上; 3. NameNode根据配置文件中指定的备份(replica)数量及机架感知原理进行文件分配,返回可用的DataNode的地址 以三台DataNode为例:A B C 注: Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为:第一个备份放在客户端相同的datanode上(若客户端在集群外运行, 就随机选取一个datanode来存放第一个replica),第二个replica放在与第一个replica不同机架的一个随机datanode上,第三个replica放在与第二个repli ca相同机架的随机datanode上,如果replica数大于三,则随后的replica在集群中随机存放,Hadoop会尽量避免过多的replica存放在同一个机架上.选取repl ica存放在同一个机架上.(Hadoop 1.x以后允许replica是可插拔的,意思是说可以定制自己需要的replica分配策略) 4. client请求3台的DataNode的一台A上传数据,(本质是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成后,逐 级返回client; 5. client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认 64K),A收到一个packet就会传给B,B传递给C;A每传一 个packet会放入一个应答队列等待应答. 注: 如果某个datanode在写数据的时候宕掉了下面这些对用户透明的步骤会被执行: 1) 管道线关闭,所有确认队列上的数据会被挪到数据队列的首部重新发送,这样也就确保管道线中宕掉的datanode下流的datanode不会因为宕掉的datanode而丢 失数据包 2) 在还在正常运行datanode上的当前block上做一个标志,这样当宕掉的datanode重新启动以后namenode就会知道该datanode上哪个block是刚才宕机残留下 的局部损坏block,从而把他删除掉 3) 已经宕掉的datanode从管道线中被移除,未写完的block的其他数据继续呗写入到其他两个还在正常运行的datanode中,namenode知道这个block还处在und er-replicated状态(即备份数不足的状态)下,然后它会安排一个新的replica从而达到要求的备份数,后续的block写入方法同前面正常时候一样 4) 有可能管道线中的多个datanode宕掉(一般这种情况很少),但只要dfs.relication.min(默认值为1)个replica被创建,我么就认为该创建成功了,剩余的re lica会在以后异步创建以达到指定的replica数. 6. 数据被分割成一个个packet数据包在pipeline上一次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A 将pipeline ack发送给client 7. 当一个block传输完成后,client再次发送请求NameNode上传第二个block到服务器 HDFS读数据步骤: 1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址 3. 这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client的排在前;心跳机制中超时汇 报的DN状态为STALE,这样的排在后 4. Clietn选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据 5. 底层本质是建立Socket Stream(FSDataInputStream) ,重复调用父类DataInputStream的read方法,知道这个块上的数据读取完毕; 6. 当读完列表的block后,若文件读取还没有结束,客户端会继续想NameNode获取下一批的block列表 7. 读取完一个Block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读取 注: 如果在读取过程中DFSInputStream检测到block错误,DFSInputStream也会检查从datanode读取来的数据的校验和,如果发现有数据损坏,它会把坏掉的bl ock报告给namenode同时重新读取其他datanode上的其他block备份 8. read方法是并行的读取block信息,不是一块一块的读取,NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据; 9. 最终读取哎所有的block会合并成一个完整的最终文件

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。