用最简单的方法对大数据进行处理 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内存限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux(CentOS)ftp服务搭建

ftp服务器搭建 1. 下载ftp服务2. 查找ftp配置文件3. 查看配置文件信息4. Windows连接ftp服务1)使用文件资源管理器连接2)使用FlashFXP工具,比文件资源管理器好用,强烈推荐 5. Linux连接 1. 下载ftp服务 yum install -y vsftpd2. …

Docsify:快速用Markdown文档搭建网站的利器

Github官方地址:Docsify 什么是Docsify? 对于经常写博客的人来说,markdown大家都不陌生。今天介绍一个在最近需求中碰到的软件Docsify,通过它能够将Markdown直接转换为网页。话不多说,下面直接介绍它的快速用法。 D…

Apache、nginx

一、Web 1、概述 Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物…

fastapi教程(五):中间件

一,什么是中间件 中间件是一种软件组件,它在请求到达应用程序处理程序之前和/或响应发送回客户端之前执行操作。 请求从客户端发出。 请求首先经过Middleware 1。 然后经过Middleware 2。 请求到达FastAPI路由处理器。 响应从路由处理器返回。 响应经过…

如何通过 CloudCanal 实现从 Kafka 到 AutoMQ 的数据迁移

01 引言 随着大数据技术的飞速发展,Apache Kafka 作为一种高吞吐量、低延迟的分布式消息系统,已经成为企业实时数据处理的核心组件。然而,随着业务的扩展和技术的发展,企业面临着不断增加的存储成本和运维复杂性问题。为了更好地…

《LeetCode热题100》---<双指针篇四道>

本篇博客讲解LeetCode热题100道双指针篇中的 第一道:移动零(简单) 第二道:盛最多水的容器(中等) 第一道:移动零(简单) class Solution {public void moveZeroes(int[] nu…

基于CentOS Stream 9平台安装JDK17.0.12

官方: https://www.oracle.com/java/technologies/downloads/#java17 1. 下载: https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2. 存放目录 mkdir /usr/local/javacd /usr/local/java3. 解压 tar -zxvf jdk-17_linux-x64_…

除了GPT,还有哪些好用的AI工具?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 多得很,这20个免费的国产AI工具,打工人必备,除了比chatGPT好用,甚至还可以用来变现…

C语言中的指针基础

文章目录 🍊自我介绍🍊地址🍊C语言中的指针 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也要变强&am…

论文阅读-《Distant Supervision for Relation Extraction beyond the Sentence Boundary》

文章提出了首个将远程监督应用于跨句子关系提取的方法,通过整合句内和句间关系,利用图表示和多路径特征提取提高了准确性和鲁棒性。 摘要 文章提出了一种新的方法,用于在远程监督下进行跨句子的关系抽取。这种方法利用图表示来整合依赖和话…

常用传感器讲解十五--触摸传感器(KY-036)

常用传感器讲解十五–触摸传感器(KY-036) 具体讲解 这个比较简单,就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…

spark 3.0.0源码环境搭建

环境 Spark版本:3.0.0 java版本:1.8 scala版本:2.12.19 Maven版本:3.8.1 编译spark 将spark-3.0.0的源码导入到idea中 执行mvn clean package -Phive -Phive-thriftserver -Pyarn -DskipTests 执行sparksql示例类SparkSQLExam…

Kotlin 的优势:现代编程语言的卓越选择

文章目录 简洁与优雅的语法空安全特性函数式编程,支持高阶函数、lambdaKotlin 内联函数与 Java 的互操作性强大的类型推断协程支持lazy 委托object 单例模式区间表达式现代的开发工具支持 本文首发地址 https://h89.cn/archives/301.html 最新更新地址 https://gite…

科学设计程序员面试内容,破解“八股文”之弊

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义,它能够自动偷摸的为咱们的代码生成一个try…catch块,并把异常向上抛出来。 使用 SneakyThrows的使用范围: 只能作用在方法和构造函数之上。从源码就可以…

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时,dataGridView控件创建好后,左侧会多出一列为空,如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图: 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…

我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”

大家好,我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 ,并且针对该项目做了一个官网: 很多同学表示官网很好看,还好奇是怎么做的,其实这个网站的背后还有个有趣的小故事。。。 鱼皮:我们要做个官…

playbooks 分布式部署 LNMP

1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …

计算机毕业设计-程序论文-基于web线上项目竞标平台的开发与实现

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写,禁止任何人抄袭以及各类盈利性传播, 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码,请关注❥点赞收藏并私信博主&#x…

001.精读《Big Data: A Survey》

文章目录 1. 引言2. 精读2.1 摘要2.2 背景2.4 相关技术2.5 相关流程2.6 应用场景 3. 总结 1. 引言 大数据精读周刊首次与大家正式见面。我们每周将精读并分析几篇精选文章,试图讨论并得出结论性观点。我们的目标是通过深入探讨,帮助大家更好地理解大数据…