我有一个很大的UTF8文本文件(大约1000万行;包含CJK字符)。每行包含制表符分隔的字段,如:
field1 field2 a_id b_id c_id ... fieldN
我的Java程序需要
如下的伪代码:
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这样的第三方库。)
如果您能提供任何建议,我感谢您。感谢。
答案 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这样的框架来解决您的问题。新手/有经验的春季用户的学习曲线并不陡峭,您将从框架中获得灵活性和力量。