【发布时间】:2016-06-02 10:29:42
【问题描述】:
我们希望将 52000 个文件(.pdf、.xls、.doc ...等)导入 SQL Server 2012 数据库。
我有一个包含文件名的Dossier_fichier.txt 文件。我将这些名称加载到一个集合中,然后循环遍历该集合,然后尝试在目录PiecesJointes 中找到这些文件,并将它们转换为字节并使用以下代码将它们插入到数据库中:
var dossierFichiers = addOrUpdateHelper.ReadEntities<DossierFichier, DossierFichierMap>("dossier_fichier.txt").ToArray();
// (2) Parcourir toutes les instances de DossierFichier chargées + Lire le fichier référencé + Le charger dans la propriété Fichier
var dirPath = System.IO.Path.Combine(Environment.CurrentDirectory, "piecesJointes");
var nbfichier = 0;
foreach (var df in dossierFichiers) {
try {
var path = System.IO.Path.Combine(dirPath, string.Concat( df.Code,"_", df.Nom));
df.Fichier = File.ReadAllBytes(path);
context.DossierFichier.Add(df);
context.SaveChanges();
Logger.Info("Le fichier {0} a été inséré", df.Nom);
nbfichier++;
} catch (FileNotFoundException ex) {
Logger.Error("Fichier {0} : {1}", df.Nom, ex.Message);
} catch (Exception ex) {
Logger.Error("Fichier {0} : {1}",df.Nom, ex.Message);
}
}
插入 4000 个文件后,我收到了一个OutOFMemoryException,这花了很多时间(60 小时)。请你帮我插入所有这些文件而不得到OutOfmemoryException,以及如何更快地做到这一点?
【问题讨论】:
-
您的系统不会有无限的内存,您可能需要定期保存数据然后将其丢弃。或者甚至读取一个文件做你需要做的然后从内存中删除它。
-
我该如何处理它?我怎样才能从内存中删除它
-
那是在 32 位进程中运行的吗?此外,最好为 每个 插入创建新的实体框架上下文,并分别加载每个实体,不要重用上下文和实体。
-
不知道
DossierFichier是什么我不知道。这取决于您为什么需要文件字节。如果您只是读取字节并将它们存储在某处,那么我的答案将不同于您是否需要所有内存来满足程序的长度。 -
附带说明:读取 52k 文件需要一些时间。就这样。出于好奇,文件的平均大小是多少?
标签: c# entity-framework sql-server-2012