Я пытаюсь запустить приведенную ниже программу, но получаю ошибку OutOfMemory во время добавления структуры цикла StringBuilder.
- Я пытаюсь сделать что-нибудь, чтобы уменьшить использование памяти настолько, чтобы иметь возможность читать файл CSV (более 200 000 строк, но только 3 столбца: элемент, рейтинг, пользователь).
- Затем я бы создал массив 2D int, в котором уникальные элементы представляют строки, уникальные пользователи представляют столбцы, а пересечение — это рейтинг.
- Наконец, я бы использовал StringBuilder для создания выходного CSV-файла.
Спасибо за вашу помощь и время.
List<String> userList = new ArrayList<String>();
List<String> itemList = new ArrayList<String>();
FileInputStream stream = null;
Scanner scanner = null;
int[][] layout = new int[10672][24303];
int indexItemList = 0;
double temp = 0;
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 (indexItemList == 0) {
temp = Double.valueOf(elems[1]);
layout[0][0] = (int)temp;
itemList.add(elems[0]);
userList.add(elems[2]);
indexItemList++;
}
else {
boolean itemFound = itemList.contains(elems[0]);
boolean userFound = userList.contains(elems[2]);
int indexItem = 1;
int indexUser = 1;
if ((itemFound) && (userFound)) {
indexItem = itemList.indexOf(elems[0]);
indexUser = userList.indexOf(elems[2]);
temp = Double.valueOf(elems[1]);
layout[indexItem][indexUser] = (int)temp;
}
else if ((itemFound) && (!userFound)) {
userList.add(elems[2]);
indexItem = itemList.indexOf(elems[0]);
indexUser = userList.indexOf(elems[2]);
temp = Double.valueOf(elems[1]);
layout[indexItem][indexUser] = (int)temp;
}
else if ((!itemFound) && (userFound)){
itemList.clear();
itemList.add(elems[0]);
indexUser = userList.indexOf(elems[2]);
temp = Double.valueOf(elems[1]);
layout[indexItemList][indexUser] = (int)temp;
indexItemList++;
}
else if (!((itemFound) && (userFound))) {
itemList.clear();
itemList.add(elems[0]);
userList.add(elems[2]);
indexUser = userList.indexOf(elems[2]);
temp = Double.valueOf(elems[1]);
layout[indexItem][indexUser] = (int)temp;
indexItemList++;
}
}
}
}
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();
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < layout.length; i++){
for (int j = 0; j < layout[i].length; j++){
sb.append(layout[i][j] + "");
layout[i][j] = 0;
if (j < layout[i].length - 1){
sb.append(",");
}
}
sb.append("\n");
}
StringBuilder
: вы можете просто написать прямо в выходной файл. - person Maurice Perry   schedule 04.10.2019