当前位置: 首页 > news >正文

用最简单的方法对大数据进行处理 vs spark(不需要安装大数据处理工具)

一、大文件处理策略

(一)、难点

  1. 内存管理:
    大文件无法一次性加载到内存中,因为这可能会导致内存溢出(OutOfMemoryError)。

    因此,需要使用流(Stream)或缓冲区(Buffer)进行分块读取和处理

  2. 性能优化:
    I/O操作效率:频繁的磁盘读写会降低处理速度,优化I/O操作是关键。
    CPU使用率:算法的效率直接影响CPU的负载和处理时间。

    缓存策略:合理利用缓存可以减少磁盘访问次数,提高性能。

  3. 错误处理:
    文件不存在、文件损坏、磁盘空间不足等异常情况需要妥善处理,确保程序的健壮性和稳定性。

  4. 并发处理:
    对于非常大的文件,使用多线程或多进程可以加速处理过程。但这也带来了同步和通信的

    复杂性。
    分布式处理:在极端情况下,可能需要使用分布式系统来分散负载,但这会引入更多的复杂度和潜在的网络延迟。

  5. 数据完整性:
    在处理过程中保证数据的完整性和一致性,特别是在进行数据转换或清洗时。

  6. 资源回收:
    确保及时释放不再需要的资源,如关闭文件流和释放内存,避免资源泄露。

  7. 批处理与增量处理:
    需要考虑是处理整个文件还是只处理自上次处理以来新增或更改的数据。

  8. 日志记录与监控:
    记录处理过程中的关键信息,以便于调试和监控处理进度。

  9. 安全性:
    在处理敏感数据时,需要考虑数据的安全性和隐私保护。

  10. 用户交互:
    如果处理过程涉及用户界面,需要提供进度指示和取消选项,以增强用户体验。

(二)、方案选择

  1. 流式处理
    描述:使用流(如 Java 中的 InputStream 和 OutputStream 或 Python 中的 open 函数)逐行或逐块读取和写入文件,而不是一次性加载整个文件到内存中。
    优点:低内存占用,适用于任何大小的文件
    适用场景:文件解析、数据清洗、日志分析等。

  2. 分块处理
    描述:将大文件分割成多个小块,分别处理后再合并结果。
    优点:可以并行处理,提高效率;易于故障恢复。
    适用场景:大数据分析、大规模数据迁移、文件转换等。

  3. 并发/多线程处理
    描述:利用多核处理器的能力,通过多线程或进程并行处理文件的不同部分。
    优点:显著提升处理速度。
    适用场景:高性能计算、实时数据分析。

  4. 分布式处理
    描述:使用分布式系统(如 Hadoop、Spark)将文件切片分发到多个节点上进行处理。
    优点:能够处理PB级别的数据,高度可扩展。
    适用场景:大数据分析、机器学习训练、海量数据存储和检索。

  5. 云存储和处理
    描述:利用云服务提供商的存储和计算资源进行文件处理。
    优点:弹性伸缩,按需付费,无需维护硬件。
    适用场景:跨地域协作、弹性需求高的项目。

  6. 数据压缩和解压
    描述:在处理前后对文件进行压缩和解压,减少存储空间和传输时间。
    优点:节省存储成本,加快传输速度。
    适用场景:长期存储、远程传输大文件。

  7. 数据库导入导出
    描述:将文件数据导入数据库进行处理,再导出结果。
    优点:利用数据库的查询优化和事务处理能力。
    适用场景:需要复杂查询和事务支持的场景。

  8. 实时流处理
    描述:使用流处理框架(如 Apache Kafka、Apache Flink)处理持续生成的数据流。
    优点:低延迟,支持实时分析和响应。
    适用场景:实时监控、在线广告、物联网数据处理。

  9. 专用工具和软件
    描述:使用专门设计用于大文件处理的工具和软件,如 WinRAR、7-Zip、Ftrans Sync、Raysync、IBM Aspera 等。
    优点:特定功能强大,易于集成。
    适用场景:特定领域的文件同步、备份、传输。

  10. 硬件加速
    描述:利用GPU、FPGA等硬件加速计算密集型任务。
    优点:大幅提高计算速度。
    适用场景:深度学习、图形渲染、科学计算。

二、大文件处理语言选择(Python vs Java)

(一)、Python的优势

  1. 简洁性:Python的语法通常更简洁,易于编写和维护,这在处理大文件时意味着更快的开发周期。
  2. 生态系统:Python拥有丰富的库和框架,如Pandas、NumPy、Dask等,这些工具可以高效地处理和分析大量数据。
  3. 动态类型:Python的动态类型使得快速原型开发和迭代变得容易,尤其是在探索性数据分析中。
  4. 社区支持:Python社区活跃,遇到问题时很容易找到解决方案和资源。

(二)、Java的优势

  1. 性能:Java通常在执行速度上有优势,尤其是对于长时间运行的任务,JIT编译器可以优化代码执行。
  2. 静态类型:静态类型检查可以在编译时捕获更多错误,有助于构建更健壮的应用程序。
  3. 企业级支持:Java在企业环境中更为常见,特别是在处理大规模数据集和分布式系统中,如Hadoop和Spark,这些都是基于Java生态的。
  4. 垃圾回收:虽然垃圾回收有时会导致性能下降,但在处理大文件时,良好的内存管理可以防止内存泄漏。

(三)、具体性能对比

  1. I/O操作:Java和Python都可以有效地处理流式I/O,但是Java在某些情况下可能提供更好的I/O性能,特别是当使用NIO(非阻塞I/O)时。
  2. 多线程和并发:Java的多线程模型较为成熟,可以更有效地利用多核处理器进行并行处理。Python受到全局解释器锁(GIL)的限制,在多线程CPU密集型任务上表现不佳,但对于I/O密集型任务,如文件读写,多线程仍然有效。
  3. 库和框架:Python的科学计算和数据分析库(如Pandas和NumPy)提供了高性能的数组操作和数据结构,而Java则依赖于其强大的标准库和第三方库,如Apache Commons。

(四)、结论

对于数据科学家和需要快速原型开发的场景,Python可能是更优的选择。
对于需要更高执行性能、大规模分布式数据处理或企业级应用,Java可能是更合适的选择。
当涉及到复杂的业务逻辑和需要严格类型检查的场景时,Java的静态类型和丰富的企业级框架可能更有优势。
最终,选择哪种语言取决于具体的需求、团队的技能和项目的长期目标。在某些情况下,可能需要结合使用这两种语言,例如,使用Python进行数据预处理和分析,然后使用Java进行大规模数据处理和部署。

三、大文件处理具体案例

(一)、方案选择

​ 用流式方式处理大文件。允许程序逐行或逐块读取文件,而不需要将整个文件加载到内存中。这种方法特别适合内存有限的情况,因为它只需要足够的内存来处理当前正在读取的部分,从而降低了内存消耗,同时提供了更高的灵活性来处理各种数据格式

​ 不会跟pandas一样存在内存不足的现象,或者分隔符不支持的情况。

(二)、python流式处理

  1. 这个方式处理其实很简单。如果想直接用,只需要修改input_file_path 的文件路径和output_dir_path 输出路径
import os
from datetime import datetimedef split_large_csv(input_file_path, output_dir_path, rows_per_file=10_000_000):# temp_delimiter = '|'  # 选择一个不太可能出现在数据中的字符作为临时分隔符# delimiter="^^"header_written = Falsetry:with open(input_file_path, 'r', encoding='utf-8') as infile:header = infile.readline().strip()  # 读取表头行current_file_number = 0current_row_number = 0outfile = Nonefor line in infile:if current_row_number % rows_per_file == 0:# 开始新文件if outfile is not None:outfile.close()file_name = f"output_{current_file_number}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"outfile = open(os.path.join(output_dir_path, file_name), 'w', encoding='utf-8')if not header_written:  # 只写一次表头outfile.write(header + '\n')header_written = Truecurrent_file_number += 1# 替换原始分隔符为临时分隔符,然后写入文件# line = line.replace(delimiter, temp_delimiter)outfile.write(line)# 增加行计数器current_row_number += 1if outfile is not None:outfile.close()except Exception as e:print(e)# 调用函数
print(datetime.now())
input_file_path = r"G:\***\***.csv"
output_dir_path = r"G:\***\split1_python\\"
split_large_csv(input_file_path, output_dir_path)
print(datetime.now())
  1. 如果想更换分隔符可以把注的启动起来,temp_delimiter可以改成你自己想要的。

    temp_delimiter = '|'  # 选择一个不太可能出现在数据中的字符作为临时分隔符
    delimiter="^^"
    line = line.replace(delimiter, temp_delimiter)
    
  2. 处理时间24G左右的文件,大约4分钟左右

    2024-07-29 14:44:34.164749
    2024-07-29 14:48:29.629815

(三)、java流式处理

  1. 这个方式处理其实很简单。如果想直接用,只需要修改INPUT_FILE_PATH 的文件路径和OUTPUT_DIR_PATH 输出路径
package org.springframework.my;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;public class split_csv {private static final int ROWS_PER_FILE = 10_000_000; // 每个文件的行数private static final String DELIMITER = "^^"; // CSV文件的分隔符private static final String INPUT_FILE_PATH = "G:\***\***.csv";private static final String OUTPUT_DIR_PATH = "G:\***\\split1\\";public static void main(String[] args) {System.out.println(new Date());try (BufferedReader reader = Files.newBufferedReader(Paths.get(INPUT_FILE_PATH))) {PrintWriter writer = null;String line;int currentFileNumber = 0;int currentRowNumber = 0;
//            String headerLine = reader.readLine().replace(DELIMITER, "^"); // 读取表头行String headerLine = reader.readLine(); // 读取表头行while ((line = reader.readLine()) != null) {if (currentRowNumber % ROWS_PER_FILE == 0) {// 开始新文件if (writer != null) {writer.close();}String fileName = "output_" + currentFileNumber + "_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".csv";writer = new PrintWriter(new File(OUTPUT_DIR_PATH + fileName));// 将表头写入新文件writer.println(headerLine);currentFileNumber++;}// 写入当前行到文件writer.println(line);
//                writer.println(line.replace(DELIMITER, "^"));// 增加行计数器currentRowNumber++;}if (writer != null) {writer.close();}} catch (IOException e) {e.printStackTrace();}System.out.println(new Date());}
}
  1. 如果想更换分隔符可以把注的启动起来,line.replace(DELIMITER, “^”) 中的"^"可以改成你自己想要的。

  2. 处理时间24G左右的文件,大约2分钟左右

    Mon Jul 29 15:32:39 CST 2024
    Mon Jul 29 15:34:48 CST 2024

(四)、总结

​ 可以感受到以上流式处理方法简单易懂。 此外推荐使用java处理大文件分割,比python处理会快很多。有了这个思路之后,可以进行对文件进行其他的加工处理操作了。也可以看到并不是只能用spark等处理大文件。

​ spark处理大文件文章推荐:
pyspark使用windows单机处理100g以上csv,突破pandas内存限制

相关文章:

用最简单的方法对大数据进行处理 vs spark(不需要安装大数据处理工具)

一、大文件处理策略 (一)、难点 内存管理: 大文件无法一次性加载到内存中,因为这可能会导致内存溢出(OutOfMemoryError)。 因此,需要使用流(Stream)或缓冲区&#xff08…...

非线性校正算法在红外测温中的应用

非线性校正算法在红外测温中用于修正传感器输出与实际温度之间的非线性关系。红外传感器的输出信号(通常是电压或电流)与温度的关系理论上是线性的,但在实际应用中,由于传感器特性的限制,这种关系往往呈现出非线性。非…...

python----线程、进程、协程的区别及多线程详解

文章目录 一、线程、进程、协程区别二、创建线程1、函数创建2、类创建 三、线程锁1、Lock2、死锁2.1加锁之后处理业务逻辑,在释放锁之前抛出异常,这时的锁没有正常释放,当前的线程因为异常终止了,就会产生死锁。2.2开启两个或两个…...

将 magma example 改写成 cusolver example eqrf

1,简单安装Magma 1.1 下载编译 OpenBLAS $ git clone https://github.com/OpenMathLib/OpenBLAS.git $ cd OpenBLAS/ $ make -j DEBUG1 $ make install PREFIX/home/hipper/ex_magma/local_d/OpenBLAS/1.2 下载编译 magma $ git clone https://bitbucket.org/icl…...

微信小程序教程007:数据绑定

文章目录 数据绑定1、数据绑定原则2、在data中定义页面数据3、Mustache语法的格式4、Mustache应用场景5、绑定属性6、三元运算8、算数运算数据绑定 1、数据绑定原则 在data中定义数据在WXML中使用数据2、在data中定义页面数据 在页面对应的.js文件中,把数据定义到data对象中…...

Git -- git stash 暂存

使用 git 或多或少都会了解到 git stash 命令,但是可能未曾经常使用,下面简单介绍两种使用场景。 场景一:分支A开发,分支B解决bug 我们遇到最常见的例子就是,在当前分支 A 上开发写需求,但是 B 分支上有…...

基于YOLO的植物病害识别系统:从训练到部署全攻略

基于深度学习的植物叶片病害识别系统(UI界面YOLOv8/v7/v6/v5代码训练数据集) 1. 引言 在农业生产中,植物叶片病害是影响作物产量和质量的主要因素之一。传统的病害检测方法依赖于人工识别,效率低且易受主观因素影响。随着深度学…...

数据库开发:MySQL基础(二)

MySQL基础(二) 一、表的关联关系 在关系型数据库中,表之间可以通过关联关系进行连接和查询。关联关系是指两个或多个表之间的关系,通过共享相同的列或键来建立连接。常见的关联关系有三种类型:一对多关系,…...

实现物理数据库迁移到云上

实现物理数据库迁移到云上 以下是一个PHP脚本&#xff0c;用于实现物理数据库迁移到云上的步骤&#xff1a; <?php// 评估和规划 $databaseSize "100GB"; $performanceRequirements "high"; $dataComplexity "medium";$cloudProvider &…...

[Spring] MyBatis操作数据库(进阶)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

【Websim.ai】一句话让AI帮你生成一个网页

【Websim.ai】一句话让AI帮你生成一个网页 网站链接 websim.ai 简介 websim.ai接入了Claude Sonnet 3.5&#xff0c;GPT-4o等常用的LLM&#xff0c;只需要在websim.ai的官网指令栏中编写相关指令&#xff0c;有点类似大模型的Prompt&#xff0c;指令的好坏决定了网页生成的…...

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器&#xff08;web server&#xff09; 也称HTTP服务器&#xff08;HTTP server&#xff09;&#xff0c;主要有 Nginx、Apache、Tomcat 等。…...

2024年必备技能:小红书笔记评论自动采集,零基础也能学会的方法

摘要&#xff1a; 面对信息爆炸的2024年&#xff0c;小红书作为热门社交平台&#xff0c;其笔记评论成为市场洞察的金矿。本文将手把手教你&#xff0c;即便编程零基础&#xff0c;也能轻松学会利用Python自动化采集小红书笔记评论&#xff0c;解锁营销新策略&#xff0c;提升…...

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…...

[Day 35] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的分布式存儲技術 區塊鏈技術自2008年比特幣白皮書發表以來&#xff0c;已經成為一種革命性的技術&#xff0c;帶來了許多創新。區塊鏈本質上是一個去中心化的分布式賬本&#xff0c;每個節點都持有賬本的副本&#xff0c;並參與記錄和驗證交易。分布式存儲是區塊鏈的重…...

Vue 3 中使用 inMap.js 实现蜂窝热力图的可视化

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 3 中使用 inMap.js 实现蜂窝热力图的可视化 应用场景介绍 蜂窝热力图是一种可视化技术&#xff0c;用于在地图上显示数据的分布情况。它将数据点划分为六边形单元格&#xff0c;并根据单元格内数据的密度…...

nginx隐藏server及版本号

1、背景 为了提高nginx服务器的安全性&#xff0c;降低被攻击的风险&#xff0c;需要隐藏nginx的server和版本号。 2、隐藏nginx版本号 在 http {—}里加上 server_tokens off; 如&#xff1a; http {……省略sendfile on;tcp_nopush on;keepalive_timeout 60;tcp_nodelay o…...

Oracle DBMS_XPLAN包

DBMS_XPLAN 包的解释和关键点 DBMS_XPLAN 包是 Oracle 数据库中一个重要的工具&#xff0c;它允许数据库管理员和开发人员以各种方式显示 SQL 语句的执行计划&#xff0c;这对于 SQL 优化和性能诊断至关重要。以下是主要函数及其描述&#xff1a; 用于显示执行计划的主要函数…...

【ffmpeg命令入门】分离音视频流

文章目录 前言音视频交错存储概念为什么要进行音视频交错存储&#xff1a;为什么要分离音视频流&#xff1a; 去除音频去除视频 总结 前言 FFmpeg 是一款强大的多媒体处理工具&#xff0c;广泛应用于音视频的录制、转换和流媒体处理等领域。它支持几乎所有的音频和视频格式&am…...

小红书笔记评论采集全攻略:三种高效方法教你批量导出

摘要&#xff1a; 本文将深入探讨如何利用Python高效采集小红书平台上的笔记评论&#xff0c;通过三种实战策略&#xff0c;手把手教你实现批量数据导出。无论是市场分析、竞品监测还是用户反馈收集&#xff0c;这些技巧都将为你解锁新效率。 一、引言&#xff1a;小红书数据…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...