gpt4 book ai didi

java - 在 Java 中创建和解析非常大的数组

转载 作者:行者123 更新时间:2023-12-01 23:58:05 31 4
gpt4 key购买 nike

我有一个 CSV 文件,包含近 200 万行和 3 列(项目、评级、用户)。我能够将数据传输到二维字符串数组或列表中。然而,当我尝试解析数组以创建 CSV 文件时,我的问题出现了,因为应用程序停止了,而且我不知道需要等待程序完成运行多长时间。

基本上,我的最终目标是能够解析大型 CSV 文件,创建一个矩阵,其中每个不同的项目代表一行,每个不同的用户代表一列,评级位于用户和项目的交集处。然后,使用该矩阵,我创建一个余弦相似度矩阵,其中的行和列由项目表示,其余弦相似度位于两个不同项目的交集处。

我已经知道如何创建 CSV 文件,但我的问题在于创建其他数组进行比较时的大循环结构。

是否有更好的方法能够处理和计算大量数据,以便我的应用程序不会卡住?

我当前的程序执行以下操作:

  1. 获取大型 CSV 文件
  2. 解析大型 CSV 文件
  3. 创建类似于原始 CSV 文件的二维数组
  4. 创建不同项目的列表(每个不同项目由索引号表示)
  5. 创建不同用户列表(每个不同用户都由一个索引号表示)
  6. 创建二维数组,其中行索引代表项目,列索引代表用户,从而得到 array[row][column] = rating
  7. 计算两个矩阵的余弦相似度
  8. 创建二维数组,其中行索引和列索引表示生成数组[row]的项目[列] = 余弦相似度

我注意到我的程序在执行第 4 步和第 5 步时卡住了如果我删除步骤 4 和 5,它仍然会在步骤 6 处卡住

我已附上我的代码的那部分

      FileInputStream stream = null;
Scanner scanner = null;

try{
stream = new FileInputStream(fileName);
scanner = new Scanner(stream, "UTF-8");
while (scanner.hasNextLine()){
String line = scanner.nextLine();
if (!line.equals("")){
String[] elems = line.split(",");
if (itemList.isEmpty()){
itemList.add(elems[0]);
}
else{
if (!itemList.contains(elems[0]))
itemList.add(elems[0]);
}
if (nameList.isEmpty()){
nameList.add(elems[2]);
}
else{
if (!nameList.contains(elems[2]))
nameList.add(elems[2]);
}
for (int i = 0; i < elems.length; i++){
if (i == 1){
if (elems[1].equals("")){
list.add("0");
}
else{
list.add(elems[1]);
}
}
else{
list.add(elems[i]);
}
}
}
}
if (scanner.ioException() != null){
throw scanner.ioException();
}
}
catch (IOException e){
System.out.println(e);
}
finally{
try{
if (stream != null){
stream.close();
}
}
catch (IOException e){
System.out.println(e);
}
if (scanner != null){
scanner.close();
}
}

最佳答案

您可以尝试设置-Xms and -Xmx 。如果您使用默认值,则可能只需要为 JVM 分配更多内存。

除此之外,您还可以修改代码,使其不会将所有内容都视为String。对于 score 列(大概是数字),您应该能够将其解析为数字值并将其存储,而不是字符串表示形式。为什么?字符串比数值使用更多的内存。即使是字符串 uses 40 bytes ,而单个数值可以是 as little as one byte .

如果单个字节可以工作(数字范围是-128到127),那么您可以用~2MB替换~80MB内存使用量。即使使用int(4字节)也会比String有巨大的改进。如果数据中存在任何其他数字(或 boolean )值,您可以进一步减少。

关于java - 在 Java 中创建和解析非常大的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58195039/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com