def smart_insert(engine, table, data, minimal_size=<NUM_LIT:5>, op_counter=<NUM_LIT:0>):
insert = table.insert()<EOL>if isinstance(data, list):<EOL><INDENT>try:<EOL><INDENT>engine.execute(insert, data)<EOL>op_counter += <NUM_LIT:1><EOL><DEDENT>except IntegrityError:<EOL><INDENT>n = len(data)<EOL>if n >= minimal_size ** <NUM_LIT:2>:<EOL><INDENT>n_chunk = math.floor(math.sqrt(n))<EOL>for chunk in grouper_list(data, n_chunk):<EOL><INDENT>op_counter = smart_insert(<EOL>engine, table, chunk, minimal_size, op_counter)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>for row in data:<EOL><INDENT>try:<EOL><INDENT>engine.execute(insert, row)<EOL>op_counter += <NUM_LIT:1><EOL><DEDENT>except IntegrityError:<EOL><INDENT>pass<EOL><DEDENT><DEDENT><DEDENT><DEDENT><DEDENT>else:<EOL><INDENT>try:<EOL><INDENT>engine.execute(insert, data)<EOL><DEDENT>except IntegrityError:<EOL><INDENT>pass<EOL><DEDENT><DEDENT>return op_counter<EOL>
An optimized Insert strategy. Guarantee successful and highest insertion
speed. But ATOMIC WRITE IS NOT ENSURED IF THE PROGRAM IS INTERRUPTED.

:type engine: Engine
:type table: Table
:type data: list
:type minimal_size: int
:type op_counter: int

**中文文档**

在Insert中, 如果已经预知不会出现IntegrityError, 那么使用Bulk Insert的速度要
远远快于逐条Insert。而如果无法预知, 那么我们采用如下策略:

1. 尝试Bulk Insert, Bulk Insert由于在结束前不Commit, 所以速度很快。
2. 如果失败了, 那么对数据的条数开平方根, 进行分包, 然后对每个包重复该逻辑。
3. 若还是尝试失败, 则继续分包, 当分包的大小小于一定数量时, 则使用逐条插入。
  直到成功为止。

该Insert策略在内存上需要额外的 sqrt(nbytes) 的开销, 跟原数据相比体积很小。
但时间上是各种情况下平均最优的。