我正在开发一个应用程序来读取只包含文本数据的文件。有时,该文件很小(约500 5bm~1mb),但有时文件大小可为5bm~20 1mb。我需要确保文件中的所有数据都存储在数据库中,以便事务进入。
文件的每一行表示将被验证和存储在该数据库中的信息。如果在此进程中发生错误,则事务将被中止。
我的文件导入过程需要如下:
导入函数
@Transactional
public void importFile(MultipartFile multipartFile) throws IOException, IllegalAccessException, NoSuchFieldException {
try (BufferedReader file = new BufferedReader(new InputStreamReader(multipartFile.getInputStream()))) {
this.validateFile(file);
}
try (BufferedReader arquivo = new BufferedReader(new InputStreamReader(multipartFile.getInputStream()))) {
String line = file.readLine();
ValidHeader validHeader = this.validHeaderService.toParse(line.split(","));
this.validHeaderService.save(validHeader);
while ((line = file.readLine()) != null)
this.importFileContent(linha.split(",")); // -> This will validade and save others file content.
}
}
ValidHeader.java
@Document(collection = "ValidHeader")
public class ValidHeader {
@Id
private ObjectId id;
@Enumerated(EnumType.STRING)
private TipoRegistro tipoRegistro;
private int pontoVenda;
//Constructor & getters & setters
}
对于小文件,事务工作正常,但我的问题是大文件。
org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 251 (NoSuchTransaction): 'Transaction 1 has been aborted.' on server localhost:27017.
但是调试时我意识到主要的问题是
com.mongodb.MongoCommandException: Command failed with error 257 (TransactionTooLarge): 'Total size of all transaction operations must be less than 16793600. Actual size is 16794367' on server localhost:27017
据我所知,Mongo将整个事务范围解释为一个单一的文档,它为什么要这样做?我该如何解决这些问题呢?
--辅助信息--
SpringDataMongo: 2.1.0.M3
MongoJavaDriver: 3.8
HibernateOgmMongoDb: 5.3.1.Final
发布于 2018-07-19 19:57:39
我不理解MongoDB,但是为什么要坚持文件中的每一行呢?您能先读取整个文件,然后再坚持吗?现在您对每一行进行事务处理,这很可能是不对的。是的,一次内存中将有20 mb,但这就是为什么我们使用带有千兆字节内存的计算机。)如果您从内存中取出(例如,您有20个GB文件),那么您可以将它们分割成块并一个一个地保存它们。
只是看看这将如何影响您的代码首先使StringBuilder。然后,在你的同时,看看附加所有的行。过了一会儿,您的持久化数据库方法
https://stackoverflow.com/questions/51429339
复制相似问题