我有一个巨大的文件(2GB),其中只包含员工编号。我必须阅读此文件并获取员工编号并调用数据库以获取员工的工资,然后将其写入另一个文件中,其中员工姓名和工资作为其行。
现在问题就在于,通过java中的简单nio直接读取这个巨大的文件,我的STS会耗尽内存,或者需要4-5小时才能完成整个读取 - 写入过程。
所以我想用Java并发来拯救我。
因为我有一个实现Runnable的类EmployeeDetails,在它的main方法中,我创建了一个核心大小和最大大小为2的线程池执行器, 指定超时并传递阻塞队列。
BlockingQueue workQueue = new LinkedBlockingQueue();
In ThreadPoolExecutor along with corePoolSize=2 , maximumPoolSize =20 , keepAliveTime = Long.MAX_VALUE, workQueue is been passed.
然后创建inputFile File对象以从path获取输入文件,并输出我需要写入数据的outputFile对象。
然后我创建了两个EmployeeDetails对象,
EmployeeDetails readFile = new EmployeeDetails(inputFile);
EmployeeDetails writeFile = new EmployeeDetails (outputFile);
然后调用ThreadPoolExecutor. submit(readFile)
和ThreadPoolExecutor submit (writeFile )
。
在班级EmployeeDetails
中,我创建了run方法,
run方法打开数据库连接,
然后BufferedReader获取文件,
while循环运行直到br.readLine() !=null
然后为每个员工调用db来获取工资,因为员工在不同的分片(MySQL)中以及其工资。
一旦工资被检索我把它放在一个列表中,一旦列表大小为10000.我需要等待一个线程并调用wrie线程将其写入文件并刷新列表以获得另外10000条记录那就是问题所在。
请建议一种从文件中读取10000条记录的方法,调用数据库获取详细信息,然后填充列表,一旦列出它,10000条记录调用写入线程来写入列表并写入另一个文件。
答案 0 :(得分:0)
我认为它不会显着提升文件的读取和写入性能。
而是考虑将实际工作 - 从db获取 - 分成线程。
在开头创建ExecutorService
,从原始线程中逐个读取行并包装到Callable中,执行fetch将它们传递给executor服务。将生成的Future传递给LinkedBlockingQueue
,这将由编写器线程使用。那将等待传入的期货并写出结果(这是为了保持订单,否则你可以直接从Callable写)。