【问题标题】:Why string is not disposed and how can I optimize the memory usage?为什么没有处理字符串,如何优化内存使用?
【发布时间】:2017-09-27 08:56:46
【问题描述】:

我正在编写一个 excel 解析 web api,它将结构化文件读入对象(循环函数)。

但我注意到在解析某些文件时内存出现显着峰值,因此会引发 OutOfMemory 异常。 excel 解析引擎需要加载整个文件才能读取其结构。而且我发现消耗大部分内存的不是加载,而是解析(​​将excel转换为结构化对象)和json http返回(将对象序列化为json)最终杀死了内存。比如一个1M的大文件可以解析成70M的json。

所以我四处搜索,找到了这个 .net Memory Profiler 并试图分析导致这种巨大内存使用的原因。这是我在两次解析同一个文件时捕获的快照。我注意到有巨大的字符串 /Object[] 没有被 GCed。

现在我迷路了。当您处理大量列表和大量字符串时,最佳实践是什么?至于减少内存使用量,我应该从哪里开始研究?处理长时间运行的进程时有哪些最佳实践(添加队列?使用 signalR 通知进程结果?)?

非常感谢一些指导!

【问题讨论】:

    标签: memory asp.net-web-api out-of-memory memory-profiling


    【解决方案1】:

    我想说你需要避免一次加载整个文件。

    这是一个很好的起点:

    Load Large Excel file in C#

    【讨论】:

    • 不幸的是,excel 解析引擎需要加载整个文件才能读取其结构。实际上,消耗大量内存的不是加载,而是解析(​​将excel转为结构化对象)和json返回(将对象序列化为json)最终杀死了内存。
    • 我建议你然后显示一些代码。根据您解析文件的方式以及您使用的 com 对象,如果您没有正确处理它们,那么您将杀死内存。您使用的每个工作表、行或其他任何内容都会保留在内存中,直到您释放它为止。
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2020-09-16
    • 1970-01-01
    • 2018-02-14
    • 2023-03-31
    • 1970-01-01
    • 2019-09-19
    • 2021-06-08
    相关资源
    最近更新 更多