Я пытаюсь прочитать данные из таблицы, в которой содержится ~ 13 миллионов записей. Я использовал setFetchSize для пакетного чтения записей, выполняя поиск и записывая их в файл csv. Но вывод csv генерируется с более чем 50 миллионами записей, чего не ожидается. Я подозреваю, что итерация работает некорректно. Любая помощь будет оценена по достоинству.
def processRecords(ParamHelper params){
try {
CSVWriter writer;
writer = new CSVWriter(new FileWriter(params.outputDir.getAbsolutePath()+"/Records_fact.csv"),(Character)'\t',(Character)'\u0000',(Character)'\n');
String contractRateSql = "select contract_id,season from table";
ResultSet resRecords = stmt.executeQuery(contractRateSql);
Map <String,Map<String,String>> masterRecords = new HashMap<String,Map<String,String>>();
Map<String,String> existingRecords = null;
int count = 0;
resRecords.setFetchSize(10000)
while(resRecords.next()) {
try{
existingRecords = new HashMap<String,String>();
existingRecords.put("cont_id",resRateRecords.getString("contract_id"));
existingRecords.put("season",resRateRecords.getString("season"));
masterRecords.put(resRecords.getString("contract_id")+"#"+count++,existingRecords);
}
catch(Exception e){
e.printStackTrace();
}
masterRecords.each{ k, v ->
try{
//some process
}catch(Exception e){
e.printStackTrace();
}
}
if (valueList.size()>0)
writer.writeAll(valueList);
try {
if (resRateRecords != null) resRateRecords.close();
} catch (Exception e) {
};
}
writer.close();
catch(Exception e){
e.printStackTrace();
println("Occured while fetching the data");
}
}
}
Да, каждый раз он дает столько результатов. Я даже пробовал использовать новый FileWriter (path).
Что такое valueList? Вы пишете только тогда, когда размер этого > 0, но я не вижу, чтобы вы добавляли к нему данные где-либо, также после того, как вы записали данные, вы никогда не очищаете valueList.
Простой вопрос: вы сказали, что ваш выходной CSV-файл содержит 50 миллионов записей, действительно ли это 50 миллионов записей или 50 миллионов строк. Потому что, если в поле в вашей базе данных есть символ новой строки, вы получите одну запись, занимающую две строки в выходном файле (т.е. a, b, «это поле занимает \ nдве строки», c, d)




Дает ли он столько результатов при повторном запуске после удаления файла
Records_fact.csv? Вы вызываетеnew FileWriter(path, true), что означает, что он добавит данные в ваш уже существующий файл.