2011-01-14 2 views
0

В настоящее время я таблица читается из примерно так:Более быстрый способ использования данных из массива String?

 ps = con.prepareStatement("SELECT * FROM testrow;"); 
     rs = ps.executeQuery(); 
     rs.next(); 
     String[] skills = rs.getString("skills").split(";"); 
     String[] skillInfo; 
     for (int i = 0; i < skills.length; i++) { 
      skillInfo = skills[i].split(","); 
      newid.add(Integer.parseInt(skillInfo[0])); 
      newspamt.add(Byte.parseByte(skillInfo[1])); 
      mastery.add(Byte.parseByte(skillInfo[2])); 
     } 
     rs.close(); 
     ps.close(); 

информация сохраняется в базе данных с помощью StringBuilder, чтобы сформировать строку из всех чисел, которые должны быть сохранены, которые были бы в формат number1, number2, number3;

Я написал тестовый проект, чтобы узнать, будет ли этот метод быстрее, чем при использовании пакетного метода MySQL, и он будет бить MySQL примерно на 3 секунды. Единственная проблема, с которой я столкнулся сейчас, - это когда я перехожу к чтению информации, MySQL завершает работу за несколько миллисекунд, где, когда вы вызываете информацию с помощью String [], чтобы разделить данные на «;», символ, а затем также используя String [] для разделения информации в цикле символом «,» занимает от 3 до 5 секунд.

Есть ли способ уменьшить время, необходимое для загрузки данных с помощью String [] или, возможно, другого метода?

ответ

1

Вы читаете информацию чаще, чем вы ее пишете? Если это так (скорее всего), то оптимизация записи, похоже, подчеркивает неправильный конец операции. Почему бы не сохранить информацию в отдельных столбцах и, таким образом, избежать расщепления (т. Е. нормализовать ваши данные)?

Если вы не можете, то можете ли вы загрузить данные в одном потоке и передать в другой поток для разделения/хранения информации. т. е. вы читаете данные в одном потоке и для каждой строки передаете (скажем) BlockingQueue в другой поток, который разбивает/сохраняет.

+0

Это экономит больше, чем написано, но мне нужна запасная часть, чтобы она выполнялась как можно быстрее. Раньше у меня была настройка таблицы навыков, чтобы иметь по одному столбцу для каждого из чисел, но при хранении в этой таблице это слишком долго выполнялось. – PuppyKevin

1

в формате число1, число2, number3

рассмотреть нормализации таблицы, что дает один номер для каждой строки.

3

Не храните сериализованные массивы в полях базы данных. Использовать 3NF?

0

Отбросьте индекс при вставке, что сделает его быстрее.

Конечно, это только вариант для пакетной нагрузки, а не для транзакций 500 секунд.

-1

Я рекомендую вместо использования метода split использовать предварительно скомпилированное регулярное выражение, особенно в цикле.

1

String.split использует регулярное выражение для своего алгоритма. Я не так, как это реализовано, но вероятность того, что это довольно тяжелый процессор. Попробуйте реализовать свой собственный метод split, используя значение char вместо обычного выражения.

0

Наиболее очевидным альтернативным методом является наличие отдельной таблицы навыков с строками и столбцами вместо отдельного поля конкатенированных значений. Я знаю, что это выглядит большим изменением, если у вас уже есть данные для миграции, но это стоит усилий по многим причинам.

Смежные вопросы