我有一个代表地图[String,Int]的CSV文件,然后我按如下方式读取文件:
def convI2N (vkey:Int):String={
val in = new Scanner("dictionaryNV.csv")
loop.breakable{
while (in.hasNext) {
val nodekey = in.next(',')
val value = in.next('\n')
if (value == vkey.toString){
n=nodekey
loop.break()}
}}
in.close
n
}
该函数给出给定Int的String。这里的问题是我必须浏览整个文件,文件很大,然后程序太慢了。有人告诉我这是O(n)复杂时间,并建议我传递给O(log n)。我想函数map.getOrElse是O(log n)。 有人可以帮我找到一种方法来获得这段代码的最佳表现吗?
作为附加注释,dictionaryNV文件按Int值排序 也许我可以按行或一组行分割文件。 CSV有167000个元组[String,Int]
或者另一种方式是如何通过scala中的csv进行某种二进制搜索?
答案 0 :(得分:0)
如果您多次呼叫confI2N
功能,那么每次必须scan
big file
时,工作肯定会很慢。因此,如果多次调用该函数,则建议将它们存储在临时变量properties
或hashmap
或collection of tuple2
中,并更改正在占用内存的其他代码。
您可以尝试以下方式,该方式应该比scanner
方式更快
假设您的csv
文件comma
分隔为
key1,value1
key2,value2
使用Source.fromFile可以作为您的解决方案
def convI2N (vkey:Int):String={
var n = "not found"
val filtered = Source.fromFile("<your path to dictionaryNV.csv>")
.getLines()
.map(line => line.split(","))
.filter(sline => sline(0).equalsIgnoreCase(vkey.toString))
for(str <- filtered){
n = str(0)
}
n
}