Python 适合大数据量的处理吗

Python012

Python 适合大数据量的处理吗,第1张

python可以处理大数据,python处理大数据不一定是最优的选择。适合大数据处理。而不是大数据量处理。 如果大数据量处理,需要采用并用结构,比如在hadoop上使用python,或者是自己做的分布式处理框架。

python的优势不在于运行效率,而在于开发效率和高可维护性。针对特定的问题挑选合适的工具,本身也是一项技术能力。

Python处理数据的优势(不是处理大数据):

1. 异常快捷的开发速度,代码量巨少

2. 丰富的数据处理包,不管正则也好,html解析啦,xml解析啦,用起来非常方便

3. 内部类型使用成本巨低,不需要额外怎么操作(java,c++用个map都很费劲)

4. 公司中,很大量的数据处理工作工作是不需要面对非常大的数据的

5. 巨大的数据不是语言所能解决的,需要处理数据的框架(hadoop, mpi)虽然小众,但是python还是有处理大数据的框架的,或者一些框架也支持python。

扩展资料:

Python处理数据缺点:

Python处理大数据的劣势:

1、python线程有gil,通俗说就是多线程的时候只能在一个核上跑,浪费了多核服务器。在一种常见的场景下是要命的:并发单元之间有巨大的数据共享或者共用(例如大dict)。

进程会导致内存吃紧,多线程则解决不了数据共享的问题,单独的写一个进程之间负责维护读写这个数据不仅效率不高而且麻烦

2、python执行效率不高,在处理大数据的时候,效率不高,这是真的,pypy(一个jit的python解释器,可以理解成脚本语言加速执行的东西)能够提高很大的速度,但是pypy不支持很多python经典的包,例如numpy。

3. 绝大部分的大公司,用java处理大数据不管是环境也好,积累也好,都会好很多。

参考资料来源:百度百科-Python

在 上一篇 中我们介绍了 MPI-3 中共享内存操作,下面我们将介绍 MPI 中多线程的使用,以助于我们理解 MPI-3 中引进的线程安全的 Mprobe 操作(将在 下一篇 中介绍)。

通常 MPI 中大多数操作的基本实体是进程,但是MPI 进程中可以执行多个线程。

进程是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。通常在一个进程中可以包含若干个线程,一个进程中至少有一个线程。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程粒度更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有独立的地址空间。

MPI 进程中可以执行多个线程,同一个进程的多个线程具有均等的机会参与该进程的 MPI 通信。

某些情况下在 MPI 中使用多线程能够提供很大的方便,如:

在单线程的情况下,一个进程无法安全地执行到其自身的阻塞点到点通信。采用多线程,则可使同一个进程的两个线程分别执行阻塞发送和阻塞接收而不至于死锁。

MPI 要求 MPI_Init 和 MPI_Finalize 调用必须在相同线程内配对执行,执行了这两个操作的线程被称作主线程(main thread),主线程的 MPI_Finalize 调用必须在所有其它线程都执行完 MPI 相关的通信、I/O 和其它 MPI 操作之后执行。

线程安全性是指多个线程可以同时执行消息传递的相关调用而不会相互影响。

MPI被设计为线程安全的,但应用程序自身负责维护多线程安全,一个简单的办法是在不同线程使用不同的通信子对象,这样可实现线程间操作的互不干扰。MPI 的大多数操作都满足线程安全性的条件,但是也有例外,如在多线程中使用 MPI.Comm.Probe 或 MPI.Comm.Iprobe 来确定一个消息的来源和大小,然后接收该消息的操作就不是线程安全的,不过 MPI-3 提供了线程安全的版本 MPI.Comm.Mprobe 和 MPI.Comm.Improbe,这些将在 下一篇 中介绍。另外 MPI.File.Seek 也不是线程安全的,但是可以用线程安全的显式偏移文件操作函数,如 MPI.File.Read_at 等来替代其操作。

该函数除了实施正常由 MPI.Init 执行的初始化之外,还负责初始化 MPI 多线程执行环境。 reauired 参数指出所要求的多线程支持程度,可能的取值如下:

这些常数都是整数,并且在数值上是从小到大的。

该函数返回 MPI 环境实际支持的多线程级别。

MPI.COMM_WORLD 中不同进程可分别设置不同的线程支持级别。多线程 MPI 中调用 MPI.Init 的实际效果等价于用 MPI.THREAD_SINGLE 调用 MPI.Init_thread。

注意 :使用 mpi4py 时,MPI.Init 和 MPI.Init_thread 在从 mpi4py 包中 import MPI 时会被自动调用,因此一般不用在程序中显式调用。mpi4py 中 MPI.Init_thread 默认 required 的线程级别是 MPI.THREAD_MULTIPLE,但实际得到的线程级别由 MPI 环境给出。如果想要手动控制 MPI 程序的初始化或者设置 MPI 线程级别,可以在 import MPI 之前先 import rc 模块,并设置 rc.initialize = False,然后手动初始化,或者设置 rc.thread_level 为需要的级别("multiple", "serialized", "funneled" 或 "single")。

返回 MPI 环境支持的线程级别。

判断调用该函数的线程是否为主线程,如果是,返回 True,否则返回 False。

MPI 并没有提供创建线程的函数或方法,创建线程需由其它的工具来完成,这就保证了 MPI 程序可以使用任何与 MPI 实现兼容的线程,而不局限于某一种特定的线程。比较广泛使用的线程工具有 Pthreads 库和 OpenMP 库。

在 Python 中则可以使用 thread 模块(Python 3 中被命名为 _thread),但是更常用的是建立在其之上的更易用更高级别的线程模块 threading 。下面对 threading 模块作简要的介绍。

threading 模块提供了若干函数和对象,这里主要介绍 threading.Thread 对象。该对象表示一个单独运行的线程活动,可以通过两种方式来创建和运行一个单独的线程:为其传递一个可以被调用的对象;或者继承该类并重载 run() 方法。一般在子类中只能重载 __init__() 和 run() 方法,其它方法都不应该被重载。

当一个线程被创建后,必须使用 start() 方法来启动该线程,该方法会在内部调用 run() 方法。

一个线程被启动后,它的状态会是 "alive",直到该线程的 run() 方法运行停止(不管是正常结束还是异常中止)。可以用 is_alive() 方法来测试该线程是否 "alive"。

其它线程可以调用一个线程的 join() 方法,此操作会阻塞该调用线程直到被调用线程停止。

每个线程都有一个名称,如果没有设置,系统会为其分配一个默认的名称。可以在构造一个线程时为其传递一个指定的名称,或者在运行过程中通过 name 属性动态改变。

一个线程可以被标记为守护线程(daemon),守护线程可以一直运行而不阻塞主程序退出。如果一个服务无法用一种容易的方法来中断线程,或者希望线程工作到一半时中止而不会损失或破坏数据,对此服务,使用守护线程就很有用。可以通过设置线程的 daemon 属性来标记一个线程为守护线程。默认情况下线程不作为守护线程。

程序的初始线程为主线程,主线程不是守护线程。

初始化一个线程目标。 group 初始应该设置为 None,目前没有作用,为今后的扩展所保留, target 为一个可被调用的对象, name 如果非 None,设置线程的名称,默认名称为 "Thread-N",N 为一个数字, args 和 kwargs 为其它参数。

如果子类要重载此构造方法,必须首先调用基类的构造方法(Thread.__init__()),然后再做其它事情。

启动该线程。一个线程只能至多调用一次该方法,否则会抛出 RuntimeError 异常。

线程的活动或工作。可以在子类中重载该方法以完成需要的工作。

等待线程停止。默认情况下调用该方法的线程会无限阻塞直到被调用线程停止,但是如果 timeout 参数设置为一个浮点数,则只会等待 timeout 秒就返回,无论被调用线程是否中止。该方法总是返回 None,因此必须调用 is_alive() 方法来确定该调用的返回是由于被调用线程停止还是由于等待了 timeout 时间。

可以调用一个线程的 join() 方法多次。

返回该线程是否 "alive"。

线程的名称,为一个字符串。

线程的标识符,为一个非 0 整数。

一半布尔值表示线程是否为守护线程。

下面给出使用例程。

运行结果如下:

以上介绍了 MPI 中多线程的使用,在 下一篇 中我们将介绍 MPI-3 中线程安全的 Mprobe。