如何将大文件快速入库?

如何将大文件快速入库?

在开发过程中,往往会有大数据量的文件需要做入库处理,这些文件少则几百兆,多则几十G. 如果处理方法不得当,会浪费你大量的时间和精力,甚至做无用功。

入库需要考虑的问题

  1. 对原有数据是否有影响,比如数据重复导致唯一性问题。
  2. 是否需要生成主键,需要通过算法生成主键,这种方式只能通过程序读取文件。
  3. 原始数据是否需要经过处理才能入库。

文件的准备操作

  1. 如果文件能通过简单命令处理就能入库,那么久没必要使用程序处理。

    比如需要将文件某一个字段的值中的 替换为空字符串。通过一个批处理命令就可以办到了。

  2. 如果文件是大量的小文件,可以先将文件合成一个文件。比如:a.txt、b.txt、c.txt 三个小文件。

    # 合并后缀为.txt的文件到 all.txt
    cat *.txt > all.txt
    
  3. 如果文件太大,也可考虑将文件分割成大小相同或者行数相同的一些列小文件,这样方便单个处理。比如有文件:single.txt,根据行数进行分割。分割后生成new_01,new _02.....

    #查看文件行数
    wc -l single.txt
    
    #按每个文件100000行进行分割,-a 指定分割后生成的文件编号的位数,-d 表示使用数字编号
    split -a 2 -l 100000 -d single.txt new_
    
    #统一给文件加上后缀(在分割生成的目录下执行)
    for file in *;\
     do mv "$file" "$file.txt";\
    done
    
    
    

数据库的准备工作

  1. 如果导入数据没用到自增主键,那么尽可能取消掉主键约束。

    可以在读取文件的程序中使用主键自增算法(zk自增ID,snowflake算法),这样可以避免主键重复。待文件导入后在加上主键约束。

  2. 尽可能取消掉字段的唯一索引,唯一索引每次插入会去检查字段的唯一性。

    对于需要去重的字段、建议在所有数据都入库完成后进行去重。在程序中去重没有意义(文件太大),查询判断存在与否,对插入的效率影响极大。 数据的去重可以参照我的去重小案例

  3. 可以将要操作的表的引更换为MyISAM,导入完成后切换回Innodb

    #切换为MyIsam引擎
    ALTER TABLE 表明 ENGINE=MyISAM;
    #切换为InnoDb
    ALTER TABLE 表明 ENGINE=Innodb;
    

入库工作

  1. 不需要通过程序处理即可入库的文件(字段完美契合需求、不用生成主键)

    步骤一:如果有多个小文件可以使用cat命令将文件合并成一个,对文件中要替换的符号进行处理。

    步骤二:将文件复制到MySql的安装机器上(也可以通过Navicat 来导入本地的文件)。

    步骤三:登录到MySql,使用load data infile 命令来导入数据。使用命令时注意文件中的特殊字符和分割的的冲突。

    步骤四:切换数据表的存储引擎,去除重复的字段。添加主键约束、添加索引。

  2. 需要对文件的字段进行程序处理或者通过算法生成主键。

    这种方式入库需要考虑文件过大造成OOM问题,所以一般都会对大文件进行split分割,然后单独处理多个小文件。这个时候又要考虑效率问题了,如何高效的对多个文件进行处理。可以使用多线程并行的对多个文件进行读取、然后使用批处理的方式插入数据库(批插入的效率很高)。

    步骤一:使用split命令对文件进行均匀分割处理,对文件中要替换的符号进行处理。

    步骤二:使用多任务并行的方式进行读取,比如有文件new_01——new_100,可以使用10个线程,每个线程循环读完10个文件,每次读取1w条后批量插入到数据库。并行方式很多比如Fork/Join,最简单的就是使用Thread 的 join()方法 来实现并行。这样会极大的提高读取和写入效率。一般1G的文件几分钟就插入完了。

    步骤四:切换数据表的存储引擎,去除重复的字段。添加主键约束、添加索引。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,898评论 2 89
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,182评论 0 9
  • 最近反思这九个月的虚度,竟然没有对儿子产生积极的影响,有些茫然,不知道妥协与接纳之间的度到底在哪。无论怎样,作为母...
    周华14134阅读 282评论 2 4
  • 你们喜欢哪一个我? 12月22日中午12点22分,陈伟霆是掐着时间发出爱奇艺的代言微博的。和她一起代言的爱奇艺首席...
    等猴抱兔阅读 1,647评论 12 39
  • 你那里的雪化了吗 面对雪后的冷,你怕不怕 可有炉火温暖你的手 可有笑声填满你的家 你那里的雪化了吗 面对孤独你怕不...
    星宇牧云阅读 250评论 0 4