У меня есть следующая проблема с дизайном, на которую я надеюсь получить вашу помощь. Ниже упрощенно посмотреть на то, что код выглядитКакую структуру данных или шаблон проектирования я могу использовать для решения этой проблемы
class DataProcessor{
public List<Record> processData(DataFile file){
List<Record> recordsList = new ArrayList<Record>();
for(Line line : file.getLines()){
String processedData = processData(line);
recordsList.add(new Record(processedData));
}
}
private String processData(String rawLine){
//code to process line
}
}
class DatabaseManager{
saveRecords(List<Record> recordsList){
//code to insert records objects in database
}
}
class Manager{
public static void main(String[] args){
DatabaseManager dbManager = new DatabaseManager("e:\\databasefile.db");
DataFile dataFile = new DataFile("e:\\hugeRawFile.csv");
DataProcessor dataProcessor = new DataProcessor();
dbManager.saveRecords(dataProcessor.processData(dataFile));
}
}
Как вы можете видеть, метод «ProcessData» класса «DataProcessor» принимает объект DataFile, обрабатывает весь файл, создавать объект записи для каждой строки, а затем он возвращает список объектов «Запись».
Моя проблема с методом processData: когда необработанный файл действительно огромен, объекты «Список записей» занимают много памяти, а иногда программа терпит неудачу. Мне нужно изменить текущий desgin так, чтобы использование памяти было сведено к минимуму. «DataProcessor» не должен иметь прямого доступа к «DatabaseManager». Я думал о передаче очереди методу processData, где один поток запускал метод processData для вставки объекта «Запись» в очередь, а другой поток удалял объект «Запись» из очереди и вставлял его в базу данных. Но я не уверен в проблемах с этим.
не могли бы вы уточнить? DatabaseManager использует JDBC-интерфейс для SQLite и просто простой подготовленный оператор, где я получаю значения из объекта «Запись» и помещаю их в оператор «insert», а затем выполняю это вставку. –
вот пример: https://tododev.wordpress.com/2014/08/14/creating-and-object-stream-from-a-jdbc-resultset/ –