TXT 数据文件批量导入DB

txtdb:(WIP) 一个用 Rust 编写的简单数据库系统,用于在文本文件中存储数据 数据库 一个用 Rust 编写的简单数据库系统 这仍然是实验性的。 不使用 TBD 更多文档和信息 立即下载

应用背景:

现有100-200个TXT数据文件,每个文件中存贮的数据量不尽相同,例如有的存储2~3万条,有的存贮2~3百条数据,现需要将这些文件导入到Sql Server数据库中;导入过程需在前台页面中显示出每个文件导入的基本情况(导入数量,状态码,出错的行数等)。

思路探寻:

(1)项目DAO层使用的Hibernate,经测试导入一个2万多条的文件,加上TXT文件逐行解析,和生成List;加上使用Hibernate的插入到数据库中大约需要15-20秒的时间,用时太长;

(2)使用原生JDBC技术进行分批(随机分组和按文件大小分组)操作;最终导入全部文件大约需要3.5分钟左右,

本文目的:

记录本次导入笔记,希望 猿友 在导入过程中和多线程并发上给出宝贵的意见,在此先表谢意!


STEP 1 : 定义文件导入过程中每个文件导入的信息 ENTITY

/**
 * @Description 记录TXTGPS文件导入过程信息;
 */
public class ReceiveGpsTO {
    // 导入批TXT文件所在目录
    private String importDir;
    // 要导入的文件名称
    private String importfileName;
    // 导入成功的总行数
    private int importRows;
    // 导入状态
    private String importState;
    // 导入过程中备注信息
    private String importRemark;
    // 导入过程中出错的行号
    private int errorRow;
    // 导入一个文件所需时间,默认毫秒
    private int importTime;
	
    public String getImportDir() {
        return importDir;
    }
    public String setImportDir(String importDir) {
       this.importDir = importDir
    }
    
    ......
}

STEP 2 : 接收页面请求,开始进行导入

public class ReceiveGpsDataFS implements IReceiveGpsDataFS {
	
    private final static Logger logger = LoggerFactory.getLogger(ReceiveGpsDataFS.class);

    @Override
    public GpsTableDataInfo receiveGpsData(ReceiveGpsTO gpsTO, int rangeStart,
		int fetchSize) {
	Long bTime = System.currentTimeMillis();
	GpsTableDataInfo tableData = new GpsTableDataInfo();
	tableData.setRltMsg(GPSConstants.IMPORT_SUCCESS);
	int sumNum = 0;
	List<ReceiveGpsTO> rltList = new ArrayList<ReceiveGpsTO>();
	if(StringUtils.hasText(gpsTO.getImportDir())){
		File dirFile = new File(gpsTO.getImportDir());
		if(dirFile.isDirectory()){
		    File[] importFiles = dirFile.listFiles();
		    //MARK: 对导入的大量文件进行两种策略分组处理;
		    List<List<File>> groupList = (GPSConstants.RANDOM_OR_SIZE_DIDIVE_STRATEGY) ? 
						RandomGroupUtil.getGroupByRandom(importFiles, GPSConstants.FILE_NUM_4_GROUP) : 
							RandomGroupUtil.getGroupBySize(importFiles, GPSConstants.FILE_NUM_4_GROUP);
		    for(List<File> gl : groupList){
			//MARK: 阻塞执行;执行完一组,拿到结果后执行下一组;
			logger.info("开始导入GPS组文件:{}", gl);
			List<ReceiveGpsTO> eachGroupRltList = ImportGpsData2DB.importGpsData(gl);
			rltList.addAll(eachGroupRltList);
			logger.info("开始导入GPS组文件:{} 结束", gl);
		    }
		}else{
		    logger.error("导入的文件路径{}不是正确的目录", gpsTO.getImportDir());
		    tableData.setRltMsg(GPSConstants.IMPORT_DEFAULT);
		}
		for(ReceiveGpsTO t : rltList){
		    sumNum += t.getImportRows();
		}
		tableData.setTotalCount(sumNum);
		tableData.setData(rltList);
		Long eTime = System.currentTimeMillis();
		logger.info("导入文件数量:"+rltList.size()+" 总耗时分钟: "+(eTime-bTime)/GPSConstants.SECOND_2_MS);
	}
	    return tableData;
    }
	
}

对STEP 2 中用到的常量和文件分组方式进行简单说明:

对需要导入的100多个TXT文件进行分组导入,分组时提供两种分组方式: 一种,随机进行分组,也就是在同一个组内,可能有的文件比较大,有的文件比较小,例如:(File1:3M, File2 : 1M, File3: 4M, File4: 20KB);这种分组的好处:每组文件总的大小相对稳定,不会导致一组文件特别到,因为后期导入时按组开线程,使用Callable接口 拿CONNECTION操作,可以降低OOM概率;第二种:按文件大小分组,也就是说同一组内,每个文件的大小不相上下,好处,后期插入时,使用Future.get方法时是阻塞方法,可以有效的减下彼此间的等待时间,速度快,同时也增加了OOM概率。

常量:

public class GPSConstants {
    //导入STATE
    public static final String IMPORT_DEFAULT = "FAILURE";
    public static final String IMPORT_SUCCESS = "SUCCESS";
    public static final int SECOND_2_MS = 1000;
	
    //导入文件进行随机分组:好处:减小OOM概率 
    //导入文件按大小分组:好处:导入速度相当较快;坏处:当每组文件数量比较多时,增加OOM概率
    //true : 随机分组 false: 按大小分组;
    public static final boolean RANDOM_OR_SIZE_DIDIVE_STRATEGY = true;
    //public static final boolean SIZE_DIDIVE_STRATEGY = true;

    //导入文件分组:每组中文件个数;建议当JVM XMx<300不要超过5个;
    public static final int FILE_NUM_4_GROUP = 4;
	
}

两种分组方式:

/**
 * @Description 随机分组工具类, 提供按文件大小分组和随机分组方式
 */
public class RandomGroupUtil {

    /**
     * @Dscription 随机分组模式
     * @param origData 要分组的数据;
     * @param numOfEachGroup 每组中成员数量;
     * @return
     */
    public static <T> List<List<T>> getGroupByRandom(T[] origData, int numOfEachGroup) {
	int len = origData.length;
    	List<T> origList = new ArrayList<T>();
    	List<List<T>> groupsList = new ArrayList<List<T>>();
    	for(T f : origData)
    	    origList.add(f);
    	if(len < numOfEachGroup) {//只分一组
    	    groupsList.add(origList);
    	    return groupsList;
    	}
        // 计算可以分多少组
        int groupNum = ((len + numOfEachGroup) - 1) / numOfEachGroup;
        for (int i = 0; i < groupNum-1; i++) {
            List<T> group = new ArrayList<T>();
            for (int j = 0; j < numOfEachGroup; j++) {
                int random = getRandom(origList.size());
                group.add(origList.get(random));
                origList.remove(random);
            }
            groupsList.add(group);
        }
        // 最后剩下的人分成一组;
        groupsList.add(origList);
        return groupsList;
    }
	
    /**
     * @Decription 按文件大小进行分组,每组成员中所含的文件大小相近
     * @param files
     * @param numOfEachGroup 每组中要包含的成员数量;
     * @return 分好的组
     */
    public static List<List<File>> getGroupBySize(File[] files, int numOfEachGroup) {
	int len = files.length;
    	List<File> orgList = new ArrayList<File>();
    	List<List<File>> groupsList = new ArrayList<List<File>>();
    	for(File f : files)
    	    orgList.add(f);
    	if(len < numOfEachGroup) {//只分一组
    	    groupsList.add(orgList);
    	    return groupsList;
    	}
    	//按文件大小排序
    	Collections.sort(orgList, new Comparator<File>(){
	    public int compare(File o1, File o2) {
		if( o1.length() == o2.length())
		    return 0;
		return (o1.length() - o2.length() > 0) ? 1 : -1;
	    }
    	});
        // 计算可以分多少组
        int groupNum = ((len + numOfEachGroup) - 1) / numOfEachGroup;
        for (int i = 0; i < groupNum-1; i++) {
            List<File> group = new ArrayList<File>();
            for (int j = 0; j < numOfEachGroup; j++) {
                group.add(orgList.get(orgList.size()-1));
                orgList.remove(orgList.size()-1);
            }
            groupsList.add(group);
        }
        // 最后剩下的人分成一组;
        groupsList.add(orgList);
        return groupsList;
    }
	
    private static int getRandom(int num) {
        Random r = new Random();
        return r.nextInt(num);
    }
}

STEP 3 : 使用 Executors 和 DataSource 数据源连接池按组进行批量导入


/**
 * @Description : 使用executor调用call, 导入状态信息封入ReceiveGpsTO
 *
 */
public class ImportGpsData2DB {
    private static final Logger logger = LoggerFactory.getLogger(ImportGpsData2DB.class);
    
    private static ExecutorService executor = null;
    private static WrapDataSource dataSource = null;

    static{
	executor = Executors.newFixedThreadPool(GPSConstants.FILE_NUM_4_GROUP);
	dataSource = (WrapDataSource) ZBus.findCommonService("dataSource");
    }
	
    public static List<ReceiveGpsTO> importGpsData(List<File> gl) {
	List<ReceiveGpsTO> rList = new ArrayList<ReceiveGpsTO>();
	List<Future<ReceiveGpsTO>> fList = new ArrayList<Future<ReceiveGpsTO>>();
	for(File file : gl){
	    Connection conn = null;
	    try {
		conn = dataSource.getConnection();
	    } catch (SQLException e) {
                logger.error("{}从连接池中获取数据库连接失败, 本组文件 {} 导入失败", ImportGpsData2DB.class.getName(), gl);
		e.printStackTrace();
                return rList;
	    }
            // 开启线程进行导入
	    Future<ReceiveGpsTO> future = executor.submit(new ImportGpsCallable(file, conn));
	    fList.add(future);
	}
	for(Future<ReceiveGpsTO> f : fList){
	    try {
		ReceiveGpsTO rTO = f.get();
		rList.add(rTO);
	    } catch (Exception e) {
                logger.error("{} 获取本组文件{} 导入状态失败", ImportGpsData2DB.class.getName(), f);
		e.printStackTrace();
	    } 		
	}
	return rList;
    }

}

数据源配置:

<beans>
    <bean id="dbproperties"
	class="com.ssb.***.config.PropertyPlaceholderConfigurer">
	<property name="locations">
	    <value>classpath:*.db.properties</value>
	</property>
    </bean>
    <bean id="dataSource"
	class="com.zte.WrapDataSource"
	destroy-method="close" init-method="initSource">
	<property name="driverClassName"
		value="${ssb.driverClassName}" />
	<property name="url"
		value="${ssb.url}${ssb.dbname}" />
	<property name="username" value="${ssb.username}" />
	<property name="password" value="${ssb.password}" />
	<property name="initialSize" value="5" />
	<property name="maxActive" value="30" />
	<property name="maxWait" value="-1" />
	<property name="maxIdle" value="10" />
	<property name="removeAbandoned" value="true" />
	<property name="removeAbandonedTimeout" value="30000" />
	<property name="logAbandoned" value="true" />
	<property name="encrypt" value="${ssb.isEncrypt}" />
    </bean>
</beans>

STEP 4 : 实现 CALLABLE 线程进行导入,每组中得每一个文件对应一个导入线程;

/**
 * @Description GPS数据导入线程,主要完成txt文件解析和数据库导入;
 * @author ***
 *
 */
public class ImportGpsCallable implements Callable<ReceiveGpsTO> {
	
    private static final String SQL_STR = "INSERT INTO [ZXX_MXX].[dbo].[GPS_XXX_PASS_RECORD]( ORDER_NUM, HPHM, HPZL, PASS_TIME, LONGITUDE, "
			+ "LATITUDE, SPEED, DIRECTION, POSITION_STATE, MILEAGE, RELATIVE_MILEAGE, VEHICLE_STATE, LOCATION) VALUES("
			+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	
    private File file;
    private Connection conn;
    //通过构造方法传入所需的资源
    public ImportGpsCallable(File file, Connection conn) {
	this.file = file;
	this.conn = conn;
    }

    @Override
    public ReceiveGpsTO call() throws Exception {
	ReceiveGpsTO gpsRlt = new ReceiveGpsTO();
	gpsRlt.setImportfileName(file.getName());
	Long beginImpTime = System.currentTimeMillis();
        // 通过工具类DataClearTools对TXT文件进行格式验证和数据解析;
	List<GpsVehiclePassRecord> rList = DataClearTools.getGpsRecords(file, gpsRlt);
	PreparedStatement ps = null;
	try{
            if(null != conn){
		conn.setAutoCommit(false);
		ps = conn.prepareStatement(SQL_STR);
		int[] rows = null;
		if( rList.size() > 0 ){
		    for(GpsVehiclePassRecord g : rList){
			ps.setLong(1, g.getOrderNum());
			ps.setString(2, g.getHphm());
			ps.setString(3, g.getHpzl());
			ps.setTimestamp(4, new Timestamp(g.getPassTime().getTime()));
			ps.setString(5, g.getLongitude());
			ps.setString(6, g.getLatitude());
			ps.setInt(7, g.getSpeed());
			ps.setString(8, g.getDirection());
			ps.setString(9, g.getPositionState());
			ps.setString(10, g.getMileage());
			ps.setString(11, g.getRelativeMileage());
			ps.setString(12, g.getVehicleState());
			ps.setString(13, g.getLocation());
			ps.addBatch();
		    }
		    rows = ps.executeBatch();
		    conn.commit();
		}else{
		    gpsRlt.setImportRemark("数据导入失败");
		    gpsRlt.setImportState(GPSConstants.IMPORT_DEFAULT);
		}
		gpsRlt.setImportRows(rows.length);
		Long endImpTime = System.currentTimeMillis();
		gpsRlt.setImportTime((int) (endImpTime-beginImpTime));
		System.out.println(Thread.currentThread().getName()+" "+gpsRlt.getImportTime());
		gpsRlt.setImportRemark("数据导入成功");
		gpsRlt.setImportState(GPSConstants.IMPORT_SUCCESS);
	    }
	}catch(Exception e){
            conn.rollback();
	    e.printStackTrace();
	    gpsRlt.setImportRemark("数据导入失败");
	    gpsRlt.setImportState(GPSConstants.IMPORT_DEFAULT);
	}finally{
	    if(null != ps){
		ps.close();
	    }
	    if(null != conn){
		conn.close();
	    }
	}
	return gpsRlt;
    }
}

对TXT文件进行格式验证和解析的工具类 DataClearTools 如下


/**
 * @Description 对TXT文件进行解析;
 * @author ***
 *
 */
public class DataClearTools {
	
    private static final Logger logger = LoggerFactory.getLogger(DataClearTools.class);
	
    private static final String DEF_HPZL = "01";
    private static final String ENCODING = "UTF-8";
	
    /**
     * @Description 解析TXT -> List<GpsVehiclePassRecord>
     * @param file 被解析的TXT文件
     * @param to 解析过程中的状态MODEL
     * @return 解析完成的List
     */
    public static List<GpsVehiclePassRecord> getGpsRecords(File file, ReceiveGpsTO to) {
        List<GpsVehiclePassRecord> gpsList = new ArrayList<GpsVehiclePassRecord>();
	List<GpsVehiclePassRecord> duplicateList = new ArrayList<GpsVehiclePassRecord>();
	InputStreamReader read = null;
	BufferedReader bufferedReader = null;
	int row=0;
	try {
	    if (file.isFile() && file.exists()) {
		read = new InputStreamReader(new FileInputStream(file), ENCODING);
		bufferedReader = new BufferedReader(read);
		String lineTxt = null;
		while ((lineTxt = bufferedReader.readLine()) != null) {
		    row++;
		    if(1 == row){
			continue;
		    }
		    if (StringUtils.isNotBlank(lineTxt)) {// 不等于空才运行
                        GpsVehiclePassRecord pass = null;
			try{
			    pass = lineTxt2GpsPass(lineTxt);	
			}catch(Exception e){
			    throw e;
			}
			if(null != pass)
			    gpsList.add(pass);
			}else{
			    row++;
			}
		    }
		    //根据hphm和过车时间去掉重复行
		    if(gpsList.size()>0){
			duplicateList = DuplicateGpsRecord(gpsList);
		    }
		}
             }
	  } catch (IOException e) {
	    logger.error("解析GPS文件{}出错! ",file.getName());
	    to.setImportRemark("解析文件过程中出错");
	    to.setImportRows(0);
            duplicateList.clear();
	    e.printStackTrace();
	} catch (Exception e){
	    logger.error("解析GPS文件{}出错! ",file.getName());
	    to.setImportRemark("解析文件行信息过程中出错");
	    to.setImportRows(0);
	    to.setErrorRow(row);
	    duplicateList.clear();
	    e.printStackTrace();
	}finally{
	    if(bufferedReader!=null){
		try {
	            bufferedReader.close();
		} catch (IOException e) {
		    e.printStackTrace();
		}
	    }
	    if(null != read){
		try {
		    read.close();
		} catch (IOException e) {
		    e.printStackTrace();
		}
	    }
	}
	return duplicateList;
    }
	
    /**
     * @Description 根据hphm和过车时间去重;
     * @param gpsList
     * @return
     */
    private static List<GpsVehiclePassRecord> DuplicateGpsRecord(List<GpsVehiclePassRecord> gpsList) {
        List<GpsVehiclePassRecord> duplicateList = new ArrayList<GpsVehiclePassRecord>();
	for(GpsVehiclePassRecord g : gpsList){
	    if(duplicateList.contains(g)){
		continue;
	    }else{
		duplicateList.add(g);
	    }
	}
	    return duplicateList;
    }

    /**
     * @Description 根据读到的每行信息解析成Gps Model
     * @param lineTxt
     * @return
     * @throws Exception 
     */
    private static GpsVehiclePassRecord lineTxt2GpsPass(String lineTxt) throws Exception {
        GpsVehiclePassRecord record = new GpsVehiclePassRecord();
	try{
	    String[] strArr = lineTxt.split("\\s+");
	    String hphmStr;
	    //序号
	    record.setOrderNum(Long.parseLong(strArr[0].trim()));
	    //XXXX 转换过程
	    return record;
	}catch(Exception allE){
	    logger.error("解析行内容到GpsVehicelPassRecord出错");
	    throw allE;
	}
    }
}

结果展示:

CASE 1 : 对 120个TXT 文件,总共 97万5千 条数据进行导入:采用文件 随机分组策略,每组 4 个文件 ;进行导入:总共用时:576秒;

所需的Heap Size 最大不超过200M (PS: 自然包括工程其它东西占用); 在此需说明,由于 导入线程使用的是Callable,其Future.get() 方法是阻塞方法,所以每次导入的时间可能不一样,不过总体相差不会太多;

CASE 2 : 对 120个TXT 文件,总共 97万5千 条数据进行导入:采用文件 按文件大小分组策略,每组 4 个文件 ;进行导入:总共用时:366秒;所需的Heap Size 最大不超过300M (PS: 自然包括工程其它东西占用); 不过可以明显看出,时间缩短了但是需要的最大Heap Size 有所增加,

需要的HEAP SIZE 比随机导入时大的原因,按文件大小进行排序,当一组文件都比较大时,自然H S也就比较大,

所需的导入时间 366 < 576的原因是,在导入过程中使用了Callable接口,Future.get() 方法是阻塞方法,相同大小的文件在一起导入,批次不会等待太多时间;

CASE 3 : 采用 文件按大小分组,每组成员数量为5个,导入时间大概3分多点,此处不再罗列,注意并不是 每组的成员越多越好,当成员过高时需要的数据库链接也越多,到达一定量时,会方式IO阻塞问题;


尾声:

希望 朋友可以在 异常处理; 数据回归;和并发问题上给出宝贵的意见和批评,感谢;

 

原创表格数据文件转换工具,excel、access、sqliteDb、csv、dbf、txt,多种格式互换 【原创】表格数据文件转换工具。多种格式互转,(excel、access、sqlitedb、csv、dbf、txt)转成(access 或 sqlitedb 或 excel 或 csv) 立即下载

相关推荐

一个TXT转换为DB和MDB数据库的例子(Delphi)

一个TXT转换为DB和MDB数据库的例子(Delphi)

txtdb:使用python读取txt作为数据

数据是由制表符构成框架 import time #TxtDb封装 class TxtDb: #实例化 def __init__(self,File): #设置变量 self.__File = File #DB路径 #格式化数据 self.DbData = self.__GetTextData() #读取数据并...

rock_rabbit 694

CoaXPress协议入门(1)---- CXP测试套件

CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准,主要用于替代之前的Camera Link协议,常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议,主要用于传输视频和静态图像,线缆多使用单条或多条同轴电缆。CXP易于集成,可以获得灵活可靠的性能,通过使用标准的同轴线缆,比如RG59 和 RG6规格(推荐使用RG6),并且图像、控制通讯、触发、电源都可以使用同一条线缆。

素手挽剑 9506

php 文本数据库类,PHP文本数据库类之管理(txtDB.manager.php) (转)

PHP文本数据库类之管理(txtDB.manager.php) (转)[@more@]使用方法:结合txt.inc初始和密码为:admin 123CODE:/*TxtDb Managerversion: 0.1.0:This script is the manager for PHP txtDb.#############################Suppose Modify structr...

weixin_35225189的博客 299

FPGA+CMV4000实战:从零搭建20fps成像系统的5个关键步骤(附避坑指南)

本文详细介绍了如何从零搭建基于FPGA和CMV4000传感器的20fps成像系统,涵盖硬件选型、SPI通信优化、LVDS数据采集、DDR2内存管理及系统集成等5个关键步骤。特别针对CMV4000传感器的SPI配置和高速数据处理的常见问题提供实用解决方案,帮助开发者避免常见陷阱,提升成像系统性能。

weixin_42628688的博客 426

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

android 将.txt文件转化为.db并使用raw下的数据文件

在做城市搜索,此时,需要数据库,可数据源从何处获得? 1.新建一个.txt文件,以固定格式存储城市数据,如: 1||北京2||天津3|新疆|乌鲁木齐4|新疆|奎屯5|新疆|伊犁6|新疆|库尔勒7|新疆|阿克苏8|青海省|西宁 9|河北省|石家庄10|河北省|邯郸11|河北省|保定 第一个字段为_id,第二个为provience,第三个字段为city 2.建数据库 public void onCre...

guanhuaing 419

别再手动配IP了!保姆级教程:用Cisco Packet Tracer搞定DHCP服务器配置(附实验抓包分析)

本文提供了一份详细的Cisco Packet Tracer DHCP服务器配置教程,帮助用户告别手动分配IP的繁琐过程。通过构建多子网实验环境,逐步指导DHCP地址池设置、客户端测试及协议分析,并分享常见问题排查技巧,让网络配置更高效、更智能。

weixin_42535461的博客 336

Android 将txt文本文件转换成db文件 命令记录

平时记录: txt类似这样的格式: "440","广东省          ","00" "320","江苏省          ","01" "330","浙江省          ","02" "370","山东省          ","03" "350","福建省          ","04" "420","湖北省          ","05" "110","北京市

YITINGYANYU000的博客 1929

手把手教你用Isaac Sim 8打造逼真光影效果:参数设置与场景应用

本文详细介绍了如何使用Isaac Sim 8打造逼真光影效果,涵盖基础参数设置、高级材质交互、专业级灯光造型技法以及复杂场景的灯光布局策略。通过实战案例和参数调优技巧,帮助用户提升虚拟场景的视觉表现,适用于数字孪生、虚拟仿真和影视特效等领域。

weixin_30836759的博客 77

Abaqus复合材料层合板仿真

由于复合材料的损伤失效问题过于复杂,解析方法受到数学工具的限制难以实现,而实验也需要高昂的费用和时间成本难以广泛应用,Abaqus针对复合材料提供了专业的建模工具和损伤分析理论来模拟复合材料层合板在各种工况下的失效行为。

JXHXHL的博客 2538

oracle批量导入与导出——SQLloader&SPOOL用法简记

sql*loader导入数据 ①:导入路径必须为英文路径,出现中文路径会乱码无法找到ctl脚本; ②:被导入的数据可以为csv、txt、dat文件,文本格式必须全部一致,分割符号格式全部一致否则一个提交内无法导入数据; ③:在DOS窗口命令批量sql*loader导入数据 或 直接运行编写好的.bat批处理文件直接导入数据库; ④:在linux中操作与dos(win)基本相同。 一:准备 ctl控...

m0_46177407的博客 2273

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo

致力于lidar应用开发 395

mysql导入txt命令数据文件_mysql导入txt数据文件实例

mysql导入txt数据文件实例2013-08-08若要将大量的数据值插入到数据库的一个或多个表中,使用insert into语句来实现将是一项无聊的工作。1、LOAD DATA通过读取本地文件系统上的文件,可以将大量数据添加到数据库中。语法:mysql> USE db1;mysql> LOAD DATA INFILE 'datafile.txt' INTO TABLE db2.tab...

weixin_39566864的博客 1903

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【oracle】【demo】sqlldr批量导入数据

【oracle】【demo】sqlldr批量导入数据 【oracle】【demo】sqlldr --建表 create table t_student ( id integer, name varchar2(64), age int ); desc t_student; --查看数据库服务端字符集 select ...

weixin_30918633的博客 103

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

php读取txt文件组成SQL并插入数据库(原创自Zjmainstay)

/*** $splitChar 字段分隔符* $file 数据文件文件名* $table 数据库表名* $conn 数据库连接* $fields 数据对应的列名* $insertType 插入操作类型,包括INSERT,REPLACE*/function loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields=arr...

weixin_30641999的博客 93

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL8 数据库从TXT文本导入表load data local infile

一、建立.txt文本,严格按照数据库的设计字段顺序,字段中间用Table键间隔,没一行对应数据库的每一行。 二、打开MySQL 8客户端,登录进入,加载txt文件。 命令格式: load data local infile “txt路径” into table 表名; 1.load data local infile功能默认是关闭的,如果没有开启这个功能,会报错: 你可以这样做: 1)show...

mzxwswds的博客 1922

oracle数据库sqlloader,Oracle SQL Loader(sqlldr)

Oracle SQL Loader(sqlldr)SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。使用方法:一加载txt文件1创建数据文件[oracle@ogg1~]$ vim cc.txt1,2,34,5,67,8,92创建控制文件...

weixin_30719609的博客 335

本地文本TXT数据导入MySQL数据库(Load命令)

本地文本TXT数据导入MySQL数据库(Load命令) 摘要:最近需要将txt转换为MySQL,但是数据过于庞大,如果都使用插入语句输入,有点不太切实际,经过参考大佬们的经验,发现在MySQL中,使用LOAD命令可以批量的从本地文件向MySQL表中导入数据! 插入以“tab”键分隔的数据 LOAD DATA LOCAL INFILE 'D:/MySQL/files.txt' INTO TABLE 表名; 插入以“\r\n”分隔的数据 LOAD DATA LOCAL INFILE 'D:/MyS

z_hang2358568的博客 4717

用pl/sql developer 将文本文件导入Oracle数据库

1. 数据已经准备好,存放在txt文本,并且记录行是用回车分隔,列式用逗号分隔2. 打开pl/sql developer,选择Tools -> Text Importer3. 点击内窗口左上按钮(Open Data File),选择数据文本4. 小窍门:  把txt文本里的数据最上面加上一行头,与你要插入的表的结构对应即可  在Data from Textfile视图里,在中间

留下脚印 8273

Python将txt数据写入excel【分列】

目录 目的 单文件格式转换 批量文件格式转换 目的 txt数据显示中,第一行是属性,之后的每一行对应的是数据。 但是要导入数据库时,无法按属性列识别,所以必须格式化为Excel或csv的格式。 格式化后的Excel文件仍用用txt文件名命名,方便区分 单文件格式转换 #原始数据 pathDir = 'D:\workspace\A工作\BitErrorRate\data\data.TXT' filename=pathDir.split('\\')[-1].split('.')[0] #要写

多喝i热水的博客 4686

SQL*Loader 工具批量导入CVS或TXT数据

使用sqlloader批量导入oracle数据库表数据

dlorwolleh的博客 286

Oracle 之SQL_Loader

SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。 现在支持的导入文件格式主要有 .TXT 和 .CSV 现在做一个小的试验   1.在D盘建立sqlldr的控制文件,111.ctl内容如下     L...

weixin_30256901的博客 71

CSV文本数据导入工具实现

BI系统数据的导入导出会经常碰到,如何实现简易的通用导入工具呢?而不需要每次都单独开发程序实现excel数据导入。我们可以采用opencsv来解析文本文件,具体思路如下: 1.文本文件导入上传服务器 可通过jquery的ajaxfileupload异步上传,不详加描述,网上有很多相关帮助实例; 2.CSV/TXT等文本格式数据文件解析入库 代码实例: long ...

lida2006的专栏 310

bat txt数据导入数据库

1.txt文件 2.编写input.ctl

javazhanghai的专栏 431
上一篇: Spring 注解回顾
下一篇: Redis 持久化
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值