According to this driver spec "[m]ore than 16MB worth of inserts are split into multiple messages, and error indexes are rewritten." This is in addition to splitting bulk ops that contain > 1000 operations into multiple ops.
The mongo shell does split bulk ops that contain > 1000 operations into 1000-op batches. But when the bulk op exceeds 16MB, it issues an error:
The python and C drivers, on the other hand, work as expected. They split bulk ops that either contain > 1000 ops or are > 16 MB into smaller batches.