【发布时间】:2014-03-18 06:15:12
【问题描述】:
我正在编写一个应用程序,它需要从一个文件中快速反序列化数百万条消息。
应用程序所做的基本上是从文件中获取一条消息,做一些工作然后丢弃该消息。每条消息由大约 100 个字段组成(并非所有字段都总是被解析,但我需要它们,因为应用程序的用户可以决定他想要处理哪些字段)。
此时,应用程序包含在一个循环中,该循环在每次迭代中只使用readDelimitedFrom() 调用来执行。
有没有办法优化问题以更好地适应这种情况(拆分为多个文件等...)。此外,此时由于消息的数量和每条消息的维度,我需要对文件进行 gzip 压缩(并且由于字段的值非常重复,因此在减小大小方面相当有效) - 这虽然减少了性能。
【问题讨论】:
-
不能用多线程处理模型替换循环吗?
-
我避免说这个,但它已经是多线程的。本质上,文件被分成一定数量的切片,每个线程都在一个切片上工作。我在问题中描述的循环实际上是单个线程的工作
-
您能否提供一些关于应用程序架构的额外信息?乍一看,我认为文件 I/O 将是您的主要瓶颈,我很好奇文件是如何分割成片的,以及每个线程如何访问它们的文件片。
-
与应用程序相比,拆分是外部的。每个线程启动,选择 1 个切片并在其上工作,产生一个独立的输出——就结构而言,线程之间没有任何共享。线程被分配了它们在启动时必须处理的切片。
标签: java optimization protocol-buffers