javascript:如何最有效地管理跨两个文件的数据导入

时间:2014-11-24 13:06:08

标签: javascript algorithm sorting search coffeescript

我有两个API端点,我通过node.js / coffeescript脚本进行轮询:一个/addresses端点返回给定城市中的家庭地址列表,以及一个返回该端点的/homevalue端点在给定地址的房屋价值。

我正在为一个特定的城市轮询每个端点,让我们说布法罗。出于审计目的,我将在.../addresses/addresses.txt.../homeValues/homeValues.txt的本地目录中保存每个内容。该脚本运行一个城市中的所有家庭,然后将这些家庭保存到地址目录,然后轮询/homevalue端点并将结果保存在homeValues目录中的文本文件中。

然后,我做了一些变革性的工作,将地址和家庭值转换为规范化格式,将每个地址保存到一个单独的目录.../canonicalAddresses.../canonicalHomeValues中。然后,我将规范地址和主页值合并到.../unifiedAddresses/unifiedAddresses.txt

的文本文件中

我无法将这些文件保存为JSON,我必须将它们保存在文本文件中,作为一系列json对象,每行一个。我也是同步而不是异步,因为我想维护审计跟踪。

规范化地址文件是一系列行,如:

{id: 12345, address: {...}}
{id: XYZAB, address: {...}}

房屋价值清单是按年历史的,是一系列的行,如:

[{id: 12345, homevalue: {year: 1990,...}, {id: 12345, homevalue: {year: 1991,...}}...]
[{id: XYZAB, homevalue: {year: 1990,...}, {id: 12346, homevalue: {year: 1991,...}}...]

这是我对该合并的大大简化的伪代码,这要求我从磁盘读取.../addresses/addresses.txt.../homeValues/homeValues.txt

canonicalizedHomeValuesFile = "..."
canonicalizedAddressesFile = "..."
unifiedAddressFile = "..."

getHomeValue = (addressID) ->
   fs.readFileSync(canonicalizedHomeValuesFile).toString().split('\n').forEach((homevalue)=>
       << return the canonicalized home value if homevalue.ID is addressID >>
   )

fs.readFileSync(canonicalizedAddressFile).toString().split('\n').forEach((address)=>   
   address.value = getHomeValue(address.ID)
   fs.appendFileSync(unifiedAddressFile, JSON.stringify(address) + "\n")
) 

这种方法适用于少数房屋,但统一大量地址的速度非常慢。对于大约2000所房屋,这种方法每个房子需要4分钟。

在我看来,真正的瓶颈是getHomeValue()功能。什么是更有效的方法来进行查找?

1 个答案:

答案 0 :(得分:0)

如果数据足够大,可能需要预加载对象然后使用二进制搜索进行匹配。看起来每次获得home值时都会从磁盘加载文件。看起来您在readFileSync中每次迭代都要写入磁盘。如果是这种情况,您可以考虑在所有事务完成后编写该文件。我会通过批量加载和保存尽可能减少驱动器访问。