让我们考虑一个场景
我们将每个帐号都映射到交易明细,因此1个帐号可以进行多个交易。使用这些详细信息,我们必须为每个帐户生成PDF
如果假设事务CSV文件很大(> 1 GB),则加载所有详细信息并进行解析可能是内存问题。那么解析事务文件的最佳方法是什么?逐块读取也导致内存消耗。请指教
答案 0 :(得分:1)
正如其他人所说,数据库将是一个很好的解决方案。
或者,您也可以在帐号上对2个文件进行排序。大多数操作系统都提供有效的文件排序程序,例如用于Linux(在第5列上排序)
LC_ALL=C sort -t, -k5 file.csv > sorted.csv
取自Sorting csv file by 5th column using bash
然后您可以依次读取2个文件
您的编程逻辑是:
if (Accounts.accountNumber < Transaction.accountNumber) {
read Accounts file
} else if (Accounts.accountNumber = Transaction.accountNumber) {
process transaction
read Transaction file
} else {
read Transaction file
}
存储需求将为微小,您只需要保留内存中每个文件的一个记录。
答案 1 :(得分:0)
假设您正在使用Oracle作为数据库。 您可以使用Oracle SQL Loader工具将数据加载到其相应的表中。
一旦加载了数据,您就可以使用简单的SQL查询从已加载的表中联接和查询数据。
这将适用于所有类型的数据库,但是您将需要找到合适的工具来加载数据。
答案 2 :(得分:0)
首先将数据导入数据库是最优雅的方法。 除此之外,您的问题还给人留下了这样的印象:
因此,我建议您逐行读取transaction.csv(例如,使用BufferedReader)。因为采用CSV格式,每一行都是一条记录,所以您可以(在阅读时)过滤掉并忘记每条不是您当前帐户的记录。 一次文件遍历后,您拥有一个帐户的所有交易记录,通常应该将其放入内存中。 这种方法的缺点是,您最终要多次读取事务,对于每个帐户PDF生成一次。但是,如果您的应用程序需要高度优化,我建议您已经使用了数据库。