java与python在处理大文件操作上的对比

1、问题描述

现在对一个2g的大文件,抽取第二列含有特点16个串的信息,并将这些含有特串的信息,写回到两个文件中

2、具体实现

(1)java代码

package naifen;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.util.Scanner;

public class ParseNaifen {

public static void main(String[] args) throws FileNotFoundException

{

String[] wantedBrand=new String[]{"爱他美","诺优能","惠氏","雅培","美素佳儿","合生元","美赞臣","贝因美","飞鹤","喜宝","雀巢","可瑞康","金领冠","圣元","伊利","多美滋"};

try{

FileInputStream input=new FileInputStream(new File("D:/jd_naifen/jd_naifen_all"));

File dest1 = new File("D:/jd_naifen/jd_naifen_16brand_1.txt");

File dest2 = new File("D:/jd_naifen/jd_naifen_16brand_2.txt");

if(!dest1.exists())

dest1.createNewFile();

if(!dest2.exists())

dest2.createNewFile();

FileWriter outer1 = new FileWriter(dest1);

FileWriter outer2 = new FileWriter(dest2);

Scanner in = new Scanner(input,"GBK");

String str=null;

String[] temp=null;

long count=0l;

System.out.println("解析中,请等待...............");

long starttime=System.currentTimeMillis();

while (in.hasNextLine()) {

str = in.nextLine();

temp=str.split("\t");

//         System.out.println(str);

//含有16个品牌的任何一个,就将其保存下来

for(int i=0;i<16;i++)

{

if(temp[1].contains(wantedBrand[i]))

{

count++;

if(count>4036540)

outer2.write(str+"\n");

else

outer1.write(str+"\n");

break;

}

}

}

in.close();

outer1.close();

outer2.close();

long endTime = System.currentTimeMillis();

System.out.println("!!!!!!!!!!!!!提取完毕!!!!!!!!!!花费:"+(endTime-starttime)/1000+"[s]");

}catch(Exception e){

System.out.println("解析异常:"+e.getMessage());

}

}

}

运行结果:

正在解析,请稍候.......

花费时间:62s

(2)python代码

#!/bin/python

#encoding=utf8

‘‘‘

Created on 2015年8月26日

@author: zhangchangchang

‘‘‘

import sys

import time

def parseNaifen():

"""

parseNaifen

"""

destbrand=["爱他美","诺优能","惠氏","雅培","美素佳儿","合生元","美赞臣","贝因美","飞鹤","喜宝","雀巢","可瑞康","金领冠","圣元","伊利","多美滋"]

try:

file = open("D:/jd_naifen/jd_naifen_all",‘r‘)

file_dest1 = open(‘D:/jd_naifen/jd_naifen_info_python1‘,‘w‘)

file_dest2=  open(‘D:/jd_naifen/jd_naifen_info_python2‘,‘w‘)

emp = []

count=0

print ‘正在解析,请稍候.........\n‘

starttime=time.clock()

while 1:

line = file.readline()

if not line:

break

#解决了中文乱码问题

type = sys.getfilesystemencoding()

line = line.decode(type).encode(‘utf-8‘)

emp = line.split(‘\t‘)

for brand in destbrand:

if  brand in emp[1]:

count=count+1

if count > 4036540:

file_dest2.write(line +‘\n‘)

else:

file_dest1.write(line +‘\n‘)

break

elapsed=(time.clock()-starttime)

print (‘花费的时间:‘,elapsed)

finally:

file.close()

file_dest1.close()

file_dest2.close()

if __name__ == ‘__main__‘:

parseNaifen()

运行结果:

正在解析,请稍候.........

花费时间:94.19s

3、总结

(1)在读取文件操作及字符串匹配上,python比java表现出更简的操作;

(2)  在运算上,特别是大量io的情况下java比python性能更佳。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:07:09

java与python在处理大文件操作上的对比的相关文章

Java使用内存映射实现大文件的上传

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验. package test; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExc

python字符串处理与文件操作

1.strip函数 strip是trim(裁剪)掉字符串两边的空格或字符.(lstrip/rstrip) 如: 空格 theString = ' abcdbcyesornoabcbacdd ' print theString.strip() abcdbcyesornoabcbacdd 字符 theString = 'abcdbcyesornoabcbacdd' print theString.strip('abcd') #去掉两端的abcd字符 yesorno 问题:如何去掉中间空格. theS

java大文件分片上传插件

我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能够上传 支持文件夹的上传,要求服务端能够保留层级结构,并且能够续传.需要支持10万个以上的文件夹上传. 支持低版本的系统和浏览器,因为这个项目

android下大文件分割上传

由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. 1 //文件分割上传 2 public void cutFileUpload(String fileType,String filePath) 3 { 4 try 5 { 6 FileAccessI fileAccessI = new FileAccessI(filePath, 0); 7 Long nStartPo

iOS大文件分片上传和断点续传

总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传.所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理.断点续

大文件分片上传,断点续传,秒传 实现

前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽弃: 解决方案: 1,修改服务端上传的限制配置:Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好: 2,大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分

网页 大文件分片上传处理

总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传.所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理.断点续

PHP实现大文件的上传设置

打开php.ini,首先找到 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; 区域,有影响文件上传的以下几个参数: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指 打开php.ini,首先找到;;;;;;;;;;;;;;;;; File Uploads ;;;;;;;;;;;;;;;;;区域,有影响文件上传的以下几个参数

Ajax实现大文件切割上传

Ajax大文件切割上传 2015-02-07 前面我们已经实现了Ajax的文件上传,不过会受限于服务器的允许的大小, 如果服务器并非自己的,我们就要使用Ajax大文件切割来实现上传. 首先解决Ajax跨域上传问题: 在HTML5中,ajax的跨域有了新的规则-----能否跨域取决于对应的应答. 对方服务器如果愿意接受远程过来的ajax,或某几个域名过来的ajax请求,可以在头信息header中,加入Access-Control-Allow-Origin * 在PHP中加入此信息,就可以实现跨域请