Java 导入大量数据并高效搜索

Java 导入大量数据并高效搜索,java,database,performance,csv,search,Java,Database,Performance,Csv,Search,我目前正在编写一个程序,其中包含两个CSV——一个包含数据库密钥(以及与当前问题无关的其他信息),另一个是资产清单。程序检查第一个CSV中的数据库密钥,查询联机数据库以检索资产密钥,然后从第二个CSV中获取资产状态。(这是一个愚蠢的API问题的解决方法。) 我的问题是,虽然正在迭代的CSV相对较短,通常只有300行左右,但另一个是一个资产清单,很容易有10000行长(并且排序,尽管不是根据我可以从第一个CSV获得的密钥)。显然,我不想对每个输入行遍历整个资产清单,因为这将需要大约10个永恒性 我

我目前正在编写一个程序,其中包含两个CSV——一个包含数据库密钥(以及与当前问题无关的其他信息),另一个是资产清单。程序检查第一个CSV中的数据库密钥,查询联机数据库以检索资产密钥,然后从第二个CSV中获取资产状态。(这是一个愚蠢的API问题的解决方法。)

我的问题是,虽然正在迭代的CSV相对较短,通常只有300行左右,但另一个是一个资产清单,很容易有10000行长(并且排序,尽管不是根据我可以从第一个CSV获得的密钥)。显然,我不想对每个输入行遍历整个资产清单,因为这将需要大约10个永恒性

我是一个相当缺乏经验的程序员,所以我只知道排序/搜索算法,我肯定不知道该使用什么。哪种算法最有效?是否有一种方法可以“批量查询”输入CSV中列出的所有资产的清单,这比为每个键单独搜索清单更快?或者我应该使用树、哈希表或者我在其他SE线程中听到的其他东西吗?我不知道这些对性能的影响

我可以在输入时根据需要格式化清单(它只是复制粘贴到GUI中),所以我想我可以在输入时迭代整个清单,并生成一个键:行对的哈希表,然后搜索它?或者我可以把它变成一个2D数组,只搜索指定的索引?这些就是我能想到的

问题是,我不知道像这样的计算机操作需要多少时间,以及这是否会浪费时间或实际上提高性能


另外,我目前正在使用Java,因为这是我所知道的一切,但是如果另一种语言速度更快,我会全神贯注。

简单的解决方案是创建一个
HashMap
,迭代其中一个文件,并将该文件的每一行添加到
HashMap
(带有相应的键和值),然后迭代另一个,查看创建的
HashMap
是否包含键,如果是,则将数据添加到另一个
HashMap
,然后在迭代后返回第二个
HashMap

假设我们有
test1.csv
文件,其中包含
键、名称、族等内容,如下所示:

5000,ehsan,tashkhisi
2,ali,lllll
3,amel,lllll
1,azio,skkk
test2.csv
文件,其内容如
key、status
如下所示:

1000,status1
1,status2
5000,status3
4000,status4
4001,status1
4002,status3
5,status1
我们希望有这样的输出:

1 -> status2
5000 -> status3
简单代码如下所示:

1000,status1
1,status2
5000,status3
4000,status4
4001,status1
4002,status3
5,status1
Java8流:

private static Map<String, String> findDataInTwoFilesJava8() throws IOException {
    Map<String, String> map =
            Files.lines(Paths.get("/tmp/test2.csv")).map(a -> a.split(","))
                    .collect(Collectors.toMap((a -> a[0]), (a -> a[1])));
    return Files.lines((Paths.get("/tmp/test1.csv"))).map(a -> a.split(","))
            .filter(a -> map.containsKey(a[0]))
            .collect(Collectors.toMap(a -> a[0], a -> map.get(a[0])));
}
private static Map<String, String> findDataInTwoFiles() throws IOException {
    String line;
    Map<String, String> map = new HashMap<>();
    BufferedReader br = new BufferedReader(new FileReader("/tmp/test2.csv"));
    while ((line = br.readLine()) != null) {
        String[] lienData = line.split(",");
        map.put(lienData[0], lienData[1]);
    }
    Map<String, String> resultMap = new HashMap<>();
    br = new BufferedReader(new FileReader("/tmp/test1.csv"));
    while ((line = br.readLine()) != null) {
        String key = line.split(",")[0];
        if(map.containsKey(key))
            resultMap.put(key, map.get(key));
    }
    return resultMap;
}
私有静态映射findDataInTwoFilesJava8()引发IOException{
地图=
Files.lines(path.get(“/tmp/test2.csv”).map(a->a.split(“,”))
.collect(Collectors.toMap((a->a[0]),(a->a[1]);
返回文件.lines((path.get(“/tmp/test1.csv”)).map(a->a.split(“,”)
.filter(a->map.containsKey(a[0]))
.collect(Collectors.toMap(a->a[0],a->map.get(a[0]));
}
简单Java:

private static Map<String, String> findDataInTwoFilesJava8() throws IOException {
    Map<String, String> map =
            Files.lines(Paths.get("/tmp/test2.csv")).map(a -> a.split(","))
                    .collect(Collectors.toMap((a -> a[0]), (a -> a[1])));
    return Files.lines((Paths.get("/tmp/test1.csv"))).map(a -> a.split(","))
            .filter(a -> map.containsKey(a[0]))
            .collect(Collectors.toMap(a -> a[0], a -> map.get(a[0])));
}
private static Map<String, String> findDataInTwoFiles() throws IOException {
    String line;
    Map<String, String> map = new HashMap<>();
    BufferedReader br = new BufferedReader(new FileReader("/tmp/test2.csv"));
    while ((line = br.readLine()) != null) {
        String[] lienData = line.split(",");
        map.put(lienData[0], lienData[1]);
    }
    Map<String, String> resultMap = new HashMap<>();
    br = new BufferedReader(new FileReader("/tmp/test1.csv"));
    while ((line = br.readLine()) != null) {
        String key = line.split(",")[0];
        if(map.containsKey(key))
            resultMap.put(key, map.get(key));
    }
    return resultMap;
}
private static Map findDataInTwoFiles()引发IOException{
弦线;
Map Map=newhashmap();
BufferedReader br=新的BufferedReader(新文件读取器(“/tmp/test2.csv”);
而((line=br.readLine())!=null){
字符串[]lienData=line.split(“,”);
map.put(lienData[0],lienData[1]);
}
Map resultMap=new HashMap();
br=新的BufferedReader(新的文件读取器(“/tmp/test1.csv”);
而((line=br.readLine())!=null){
String key=line.split(“,”[0];
if(地图容器(图例))
resultMap.put(key,map.get(key));
}
返回结果图;
}

使用java的.hashCode()函数如何,您可以迭代小文档中有许多行的相同行数,并比较哈希值,如果它们匹配,则继续迭代。@Kl3jvi抱歉,我让它听起来好像我在尝试做一些我在原始帖子中没有做的事情。然而,这肯定会提高我程序不同部分的性能,所以我必须写下来。谢谢第二个CSV是静态的?你能将它导出到一个表中,让数据库担心优化吗?@marcellorvalle是的,它只是另一个作为CSV导出的数据库,因为他们的API不允许我们直接查询它,而导出它的唯一方法是作为CSV。我可能可以!我该怎么做呢?感谢您提供了“简单Java”示例,因为Lambda表达式仍然让我头晕目眩。请您解释一下您在第一个示例中具体做了什么,以及它实现了什么?我真的不明白。现在清楚了吗?好的,级联与lambda表达式的结合让我很困惑,因为我以前没有使用过
Stream
。我将详细介绍一下我认为你在做什么,如果我错了,请纠正我。因此,
Files.lines(路径p)
返回一个
对象。然后调用
Stream.map(函数f(){})
,并将
new Function(){public String[]apply(Object t){return t.split(“,”}})作为主体,对吗?(这个
流中的T/Object是什么?
?)Ok,返回一个新的
,然后调用
。collect(函数f1,函数f2)
on,它。。。嗯…好的,那么
Stream.collect(Collectors.toMap(f1,f2))
将流转换为
Map
给定两个“参数”——即应用于流中每一条数据的操作——然后返回由给定数据生成的
Map
实例。酷!顺便说一句,这就是我所说的“解释”,因为我必须浏览四个不同的教程网站,在能够理解正在发生的事情和对你实际所做的事情的一点描述之前,我必须在上面睡觉