高效的方式来读取大文本文件,解析每一行,并查询到MySQL

时间:2015-12-03 23:56:27

标签: java mysql performance

我有一个很大的UTF8文本文件(大约1000万行;包含CJK字符)。每行包含制表符分隔的字段,如:

field1    field2    a_id    b_id    c_id    ...   fieldN

我的Java程序需要

  1. 阅读每一行
  2. 解析每个字段
  3. 使用a_id,b_id,c_id查询 几个不同的MySQL表
  4. 撰写包含所有字段的新行
  5. 将每个新行输出到文件
  6. 如下的伪代码:

    String line   = nextline
    Entity entity = parse(line)
    
    // check cache and query to table A
    if (cacheA not contains entity.a_id)
        // select values from tableA where id = entity.a_id
    
    // check cache and query to table B
    if (cacheB not contains entity.b_id)
        // select values from tableB where id = entity.b_id
    
    // check cache and query to table C
    if (cacheC not contains entity.c_id)
        // select values from tableC where id = entity.c_id
    
    // compose and output
    append_to_file(
        compose(entity, resultA, resultB, resultC)
    )
    

    即使我可以使用线程或其他东西进行MySQL查询:

    new thread { // check cache and query to table A }
    new thread { // check cache and query to table B }
    new thread { // check cache and query to table C }
    join all threads
    
    // compose and output
    

    我仍然担心MySQL可能会有太多的IO并且花费太多时间。

    我想知道是否有更好的方法来进行MySQL选择查询? 还是比逐行读/写文件更好的方法?

    (我必须使用Java 1.6和MySQL 5.1。)

    (我可以使用像番石榴和Apache Commons这样的第三方库。)

    如果您能提供任何建议,我感谢您。感谢。

2 个答案:

答案 0 :(得分:1)

表A,B,C有多大?如果它们不是太大,请完全阅读它们(3 SELECTs)并构建映射a_id =>的哈希表。一个值。然后使用这些哈希值而不是使用MySQL 1000万次。

如果这不可行,那么将输入分解为100行的块。获取100个a_id值,使用long IN执行单个SELECT以构建哈希表。同样适用于B和C.然后处理100行。

(我建议100,因为它可能是可管理的,因为去1000,可能不会加速超过百分之几。)

答案 1 :(得分:0)

也许您急于解决问题,但考虑使用像Spring Batch这样的框架来解决您的问题。新手/有经验的春季用户的学习曲线并不陡峭,您将从框架中获得灵活性和力量。