Эффективное чтение одного миллиона данных
ловитьПредыдущийПосле введения эффективной записи файлов я недавно нашел время, чтобы изучить чтение файлов Excel. В общем, есть два способа чтения excel для пои:Пользовательский режим и режим события.
Тем не менее, чтение Excel во многих бизнес-сценариях по-прежнему использует пользовательский режим, но этот режим требует создания большого количества объектов, а поддержка больших файлов очень недружелюбна, и его очень легко OOM. Однако для режима событий вам часто нужно реализовать прослушиватель самостоятельно, и вам нужно анализировать различные события в соответствии с вашими потребностями, поэтому его сложнее использовать.
Исходя из этого, EasyExcel инкапсулирует синтаксический анализ событий часто используемых документов формата Excel и предоставляет интерфейс для брата-разработчика.Расширенная настройка, чтобы позволить вам анализировать Excel, не беспокоясь об этом.
Talk is cheap, show me the code.
использовать позу
pom
<groupId>com.github.Dorae132</groupId>
<artifactId>easyutil.easyexcel</artifactId>
<version>1.1.0</version>
нормальная осанка
Взгляните на позу ниже, как вы думаете,Нужно только заботиться о бизнес-логике?
ExcelUtils.excelRead(ExcelProperties.produceReadProperties("C:\\Users\\Dorae\\Desktop\\ttt\\",
"append_0745704108fa42ffb656aef983229955.xlsx"), new IRowConsumer<String>() {
@Override
public void consume(List<String> row) {
System.out.println(row);
count.incrementAndGet();
try {
TimeUnit.MICROSECONDS.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new IReadDoneCallBack<Void>() {
@Override
public Void call() {
System.out.println(
"end, count: " + count.get() + "\ntime: " + (System.currentTimeMillis() - start));
return null;
}
}, 3, true);
пользовательская поза
Какой? думаешьНастроить контекст, добавить обработчикСм. ниже! Вам просто нужно реализовать обработчик записей Abstract 03 и зарегистрироваться в контексте (следуйте фабрике в ExcelVersionEnums).
public static void excelRead(IHandlerContext context, IRowConsumer rowConsumer, IReadDoneCallBack callBack,
int threadCount, boolean syncCurrentThread) throws Exception {
// synchronized main thread
CyclicBarrier cyclicBarrier = null;
threadCount = syncCurrentThread ? ++threadCount : threadCount;
if (callBack != null) {
cyclicBarrier = new CyclicBarrier(threadCount, () -> {
callBack.call();
});
} else {
cyclicBarrier = new CyclicBarrier(threadCount);
}
for (int i = 0; i < threadCount; i++) {
THREADPOOL.execute(new ConsumeRowThread(context, rowConsumer, cyclicBarrier));
}
context.process();
if (syncCurrentThread) {
cyclicBarrier.await();
}
}
Фреймворк
Как показано на рисунке, это структура всего EasyExcel, среди которых (если вы поняли шаблон проектирования или прочитали соответствующий исходный код, это должно быть легко понять):
- Зеленый — расширяемый интерфейс,
- Верхняя часть предназначена для записи файлов, а нижняя — для чтения файлов.
Суммировать
На этом базовые функции EasyExcel можно считать оконченными, и все великие боги могут прийти к Выпуску. 🍗