PowerShell:将 16MB CSV 导入 PowerShell 变量会创建 >600MB 的 PowerShell 内存使用量

2023-11-26

我试图理解为什么当我导入一个大约 16MB 的文件作为变量时,PowerShell 的内存膨胀如此之大。我可以理解该变量周围有额外的内存结构,但我只是想理解为什么它那么高。这就是我在下面所做的 - 只是任何人都可以运行的另一个脚本的精简简单片段。

注释/问题

  1. 不要抱怨,试图理解为什么使用量如此之大,是否有更好的方法来做到这一点或更有效地管理内存以尊重我正在运行的系统。
  2. 同样的行为也发生在 PowerShell 5.1 和刚刚发布的 PowerShell 7(RC3)中。我不认为这是一个错误,只是我了解更多信息的另一个机会。
  3. 我的总体目标是运行一个 foreach 循环来检查另一个较小的数组与该数组的匹配或缺失。

我的测试代码

Invoke-WebRequest -uri "http://s3.amazonaws.com/alexa-static/top-1m.csv.zip" -OutFile C:\top-1m.csv.zip

Expand-Archive -Path C:\top-1m.csv.zip -DestinationPath C:\top-1m.csv

$alexaTopMillion = Import-Csv -Path C:\top-1m.csv

对于任何回答这个问题的人:感谢您的宝贵时间并帮助我每天了解更多!


一般来说请讲,iRon对该问题的评论中的建议值得关注(具体问题在本节后面的部分中讨论):

为了保持较低的内存使用率,请使用流媒体物体的数量在管线中而不是首先将它们收集到内存中- 如果可行的话。

也就是说,不要这样做:

# !! Collects ALL objects in memory, as an array.
$rows = Import-Csv in.csv
foreach ($row in $rows) { ... }

do this:

# Process objects ONE BY ONE.
# As long as you stream to a *file* or some other output stream
# (as opposed to assigning to a *variable*), memory use should remain constant,
# except for temporarily held memory awaiting garbage collection.
Import-Csv in.csv | ForEach-Object { ... } # pipe to Export-Csv, for instance

然而,即使那样你看起来can内存不足很大 files - see 这个问题 - possibly与尚未被垃圾收集的不再需要的对象的内存积累有关;所以,定期调用[GC]::Collect() in the ForEach-Object脚本块可能会解决问题 - see 这个答案举个例子。


If you do需要收集所有输出的对象Import-Csv 立刻在记忆中:

The 无节制的您观察到的内存使用情况来自于如何[pscustomobject]实例(Import-Csv的输出类型)已实现,如中讨论的GitHub 问题 #7603(强调):

内存压力很可能来自于成本PSNoteProperty[这是如何[pscustomobject]属性已实现]。Each PSNoteProperty开销为 48 字节, so 当每个属性只存储几个字节时,它就会变得巨大.

同一问题提出了解决方法以减少内存消耗(也如图所示瓦西夫·哈桑的回答):

  • 读取第一行 CVS 并动态创建定制类表示行,使用Invoke-Expression.

    • 注意:虽然在这里使用它是安全的,Invoke-Expression一般应避免.

    • 如果您事先知道列结构,则可以创建自定义class常规方式,这还允许您为属性使用适当的数据类型(否则所有属性strings默认情况下);例如,将适当的属性定义为[int] (System.Int32)进一步减少了内存消耗。

  • Pipe Import-Csv to a ForEach-Object转换每个的调用[pscustomobject]创建为动态创建的类的实例,这样可以更有效地存储数据。

注:这个解决方法的代价是昂贵的执行速度大大降低.

$csvFile = 'C:\top-1m.csv'

# Dynamically define a custom class derived from the *first* row
# read from the CSV file.
# Note: While this is a legitimate use of Invoke-Expression, 
#       it should generally be avoided.
"class CsvRow { 
 $((Import-Csv $csvFile | Select-Object -first 1).psobject.properties.Name -replace '^', '[string] $$' -join ";") 
}" | Invoke-Expression

# Import all rows and convert them from [pscustomobject] instances 
# to [CsvRow] instances to reduce memory consumption.
# Note: Casting the Import-Csv call directly to [CsvRow[]] would be noticeably
#       faster, but increases *temporary* memory pressure substantially.
$alexaTopMillion = Import-Csv $csvFile | ForEach-Object { [CsvRow] $_ }

从长远来看,一个更好的解决方案也是faster是为了使Import-Csv支持输出解析的行具有给定的输出类型,比如说,通过-OutputType参数,如提议于GitHub 问题 #8862.
如果您对此感兴趣,请表示您对该提案的支持。


内存使用基准:

以下代码将内存使用与正常情况进行比较Import-Csv导入(数组[pscustomobject]s) 解决方法(自定义类实例数组)。

该测量并不准确,因为只是查询了 PowerShell 的进程工作内存,这可以显示后台活动的影响,但它可以粗略地了解使用自定义类所需的内存减少了多少。

示例输出,显示自定义类解决方法仅需要大约one 5th下面使用的示例 10 列 CSV 输入文件(大约 166,000 行)的内存大小 - 具体比率取决于输入行数和列数:

MB Used Command
------- -------
 384.50  # normal import…
  80.48  # import via custom class…

基准代码:

# Create a sample CSV file with 10 columns about 16 MB in size.
$tempCsvFile = [IO.Path]::GetTempFileName()
('"Col1","Col2","Col3","Col4","Col5","Col6","Col7","Col8","Col9","Col10"' + "`n") | Set-Content -NoNewline $tempCsvFile
('"Col1Val","Col2Val","Col3Val","Col4Val","Col5Val","Col6Val","Col7Val","Col8Val","Col9Val","Col10Val"' + "`n") * 1.662e5 |
  Add-Content $tempCsvFile

try {

  { # normal import
    $all = Import-Csv $tempCsvFile
  },
  { # import via custom class
    "class CsvRow {
      $((Import-Csv $tempCsvFile | Select-Object -first 1).psobject.properties.Name -replace '^', '[string] $$' -join ";")
    }" | Invoke-Expression
    $all = Import-Csv $tempCsvFile | ForEach-Object { [CsvRow] $_ }
  } | ForEach-Object {
    [gc]::Collect(); [gc]::WaitForPendingFinalizers() # garbage-collect first.
    Start-Sleep 2 # Wait a little for the freed memory to be reflected in the process object.
    $before = (Get-Process -Id $PID).WorkingSet64
    # Execute the command.
    & $_
    # Measure memory consumption and output the result.
    [pscustomobject] @{
      'MB Used' = ('{0,4:N2}' -f (((Get-Process -Id $PID).WorkingSet64 - $before) / 1mb)).PadLeft(7)
      Command = $_
    }
  }

} finally {
  Remove-Item $tempCsvFile
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell:将 16MB CSV 导入 PowerShell 变量会创建 >600MB 的 PowerShell 内存使用量 的相关文章

  • gcc 不太可能使用宏

    我正在编写一段关键代码 其逻辑大致如下 if expression is true do something with extremely low latency before the nuke blows up This branch i
  • 强制jvm返回本机内存[重复]

    这个问题在这里已经有答案了 我时不时地运行需要大量内存的 eclipse 任务 因此 当任务运行时 jvm 会消耗大约 2 3GB 的 RAM 这是可以的 但是一旦 jvm 占用了该内存 它就不会释放它 并且我遇到了一种情况 堆中已用内存约
  • 序列化对于对象大小估计可靠吗?

    我使用序列化来估计对象使用的内存量 我已经读过this https stackoverflow com questions 426396 how much memory does a c net object use and this ht
  • 如何在powershell中将一个大文本文件拆分为多个文件

    你好 我有一个像这样的大文本文件 BIGFILE TXT COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COLUMN6 COLUMN7 COLUMN8 11 24 2013 50 67 51 22 50 6
  • PowerShell Group-Object 不再将对象拆分为固定大小的集合

    我在一个脚本中写了这个 我认为该脚本运行良好 但似乎已停止工作 testList object 1 object 2 object 3 object 4 object 5 counter 0 maxSize 2 groupedList te
  • 一行 PowerShell 脚本

    我创建了这个基本的单行 PowerShell 脚本 如果我运行以下命令 该脚本就会执行adAD 的 cmdlet 然后是查询的其余部分 但是尝试将它们一起运行时 它似乎只加载了 cmdlet 而没有执行 cmd 的其余部分 powershe
  • Powershell SQL Server数据库连接和连接超时问题

    我有一个连接到 SQL Server 2012 数据库的 powershell 脚本 该脚本运行 SQL 查询并将结果集放入数据表中 以将格式化的电子邮件发送给相关方 下面是问题所在的代码片段 CBA New Object System D
  • 如何在 powershell 中使用正则表达式选择“catch”代码块?

    我正在尝试分析多个目录中的大量 powershell 脚本 并且希望将任何 Catch 代码块拉入列表 变量中 我正在尝试编写一个正则表达式来选择以下格式的任何块 Catch write Host Function MyInvocation
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • iOS AVCaptureVideoDataOutput 消耗太多内存

    我在用AVFoundation使用iPhone相机捕获视频的框架 我的代码 self session AVCaptureSession alloc init self output AVCaptureVideoDataOutput allo
  • 在 python 中将变量设置为“None”是否更节省内存?

    这是一个简单的问题 但由于我没有找到任何答案 我认为答案是否定的 但是 为了确保这一点 我要问 将变量设置为是否会使Python代码更有效None当我们在函数中使用完它们之后 举个例子 def foo fname temp 1 temp 2
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • Powershell 添加的字符串类型的 ParameterizedProperty Chars 属性是什么?

    请注意 C gt Get Member MemberType eq ParameterizedProperty TypeName System String Name MemberType Definition Chars Paramete
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • 如何使用 PowerShell 查找 CPU 和 RAM 使用情况?

    我试图让 PowerShell 提供 RAM 和 CPU 使用情况 但我无法弄清楚要使用哪个 WMI 类 我的计算机有两个处理器 因此拥有这两个处理器的信息会很有用 您还可以使用 Get Counter cmdlet PowerShell
  • Powershell - 奇怪的 WSL 输出字符串编码

    今天我只是想检查我的 Windows 工作站上是否安装了特定的子系统 因此 我使用 Windows Subsystem for Linux WSL 并安装可从 Microsoft Store 获取的 Ubuntu 现在我试图找到一种方法来检
  • Powershell:复制时自动更改文件属性

    我有一个只读文件的文件夹 当我将这些文件之一复制到测试位置时 我希望能够复制它们而不保留其原始属性 我可以做到这一点 但这很长 copy item srcfilefullname destfilefullname set itemprope
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • 导入模块 WebAdministration 不会从脚本加载,但会从命令行加载

    我正在进行一个使用的项目PowerShell编写构建脚本 该构建利用了WebAdministration模块来管理本地 IIS 实例 当我运行构建脚本时 尝试导入时会引发以下错误WebAdministration 错误 06 29 2016
  • 如何在管道函数中使用 Write-Progress?

    我正在尝试编写一个函数PowerShell接受管道输入 我想使用显示进度条Write Progress 管道中每个项目的增量 例如 function Write PipelineProgress Cmdletbinding Param Pa

随机推荐

  • 打印 html 文档时所有页面中的 HTML 页眉和页脚

    我创建了一个带有页眉 一些内容和页脚的 html 页面 我尝试打印 HTML 页面 结果有 2 页 我在第一页得到了页眉 在最后一页得到了页脚 我真正需要的是在所有页面中显示页眉和页脚 就像在 Word 文档中一样 我查了一下 发现使用th
  • 如何使用 Android 数据绑定动态更改视图可见性

    我正在尝试使用数据绑定实现一种简单的视图隐藏 显示 我有一个 api 调用 并且在 api 调用正在进行时我必须显示一个进度条 一旦我收到响应 就必须忽略此进度并显示数据 我尝试使用数据绑定动态更改进度条的可见性 但什么也没发生 仅在第一次
  • Python - 使用 pytest 跳过测试,除非指定

    背景 我正在使用 pytest 来测试将数据推送到数据库的网络抓取工具 该类仅拉取 html 并将 html 推送到数据库以供稍后解析 我的大多数测试都使用虚拟数据来表示 html Question 我想做一个测试 从网站上抓取网页 但我希
  • Jaxb 生成的 xml - 根元素前缀问题

    我正在尝试使用 jaxb 生成 xml 我创建了 xsd 并生成了 java 类 但是当我生成 xml 时 我在根标记中添加前缀 ns2 这是我不想要的 例如 我希望根标签是
  • 如何使SurfaceView具有透明背景?

    我有简单的布局
  • SQLAlchemy 不会更新我的数据库

    我正在使用 SQLAlchemy 0 7 8 制作金字塔应用程序 我使用的是64位Python3 2 问题是 为什么以下函数不向数据库提交任何内容 def create card sText sCard create a wildcard
  • Objectify 和 TimerTask:没有为此线程注册 API 环境

    我想得到一个TimerTask设置为定期从 Google App Engine 数据存储中删除条目 我是否设置了一个ServletContextListener with a Timer 在 的里面contextInitialized 我已
  • 涉及 Enum 的多重继承元类冲突

    我需要一个枚举类的双重继承 但也支持我自己的方法 这是上下文 import abc from enum import Enum class MyFirstClass abc ABC abc abstractmethod def func s
  • 如何在 DENO 中使用 npm 模块?

    德诺超级酷 我早上看到了 现在想迁移到 deno 我试图将现有的 Nodejs 脚本移至 deno 任何人都可以帮助我如何在 deno 中使用 npm 模块 我需要 esprima 模块 这个有包https github com denol
  • 通过 jquery.couch.js 或其他方式在 Couchapp/CouchDB 中进行用户注册

    背景 现在 我正在尝试使用 couchDB couchapp 构建一个应用程序 该应用程序将存储来自用户的持久且重要的信息 并且停留在用户使用 couchapp 注册所需的步骤上 本质上 我想做的是有一个简单的注册表单 用户可以使用它来注册
  • 如何与 PHP 设置 WebSocket 安全连接?

    我找不到任何有关在 PHP 中设置 wss 连接的信息 我连接抛出ws没有问题 顺便说一句 我正在使用这个非常棒的库来做到这一点 https github com albeva php websocket 但我的网站使用 https 我需要
  • 设置RadioButton的value属性

    我需要根据从数据库返回的数据构建一个单选按钮列表 每个按钮都需要有一个与之关联的值 我可以根据所选按钮获取该值 理想情况下我只会使用RadioButtonList控件 但是 我需要一个非常自定义的布局RadioButtonList似乎无法处
  • 使用 Avaudioengine iOS 的低通滤波器 + 采样率转换

    我们正在开发一个项目 该项目允许我们使用一些低通滤波器和高通滤波器以 5k Hz 采样率从麦克风录制一些声音 我们正在使用什么 我们正在使用音频引擎以此目的 我们正在使用AVA音频转换器用于降低采样率 我们正在使用AVAudioUnitEQ
  • JavaScript 对象的动态深度选择

    对于单个属性 这相当简单 var jsonobj test ok var propname test Will alert ok alert jsonobj propname 但我想做的是使用嵌套属性 var jsonobj test te
  • sqlite3-ruby 无法在 rvm 1.8.7 上运行

    从 RVM 1 8 7 开始升级到 Rails 3 操作系统 10 5 8 Output josh crewss macbook joshcrews gem install sqlite3 rubyBuilding native exten
  • scrapy 蜘蛛中的多重继承

    是否可以创建一个继承两个基本蜘蛛 即 SitemapSpider 和 CrawlSpider 功能的蜘蛛 我一直在尝试从各个网站抓取数据 并意识到并非所有网站都列出了网站上的每个页面 因此需要使用 CrawlSpider 但 CrawlSp
  • 为什么浏览器不支持gRPC?

    gRPC 基于 HTTP 2 假设 得到浏览器的广泛支持 因此 我觉得从浏览器使用gRPC应该没有问题 然而 很明显有一个问题 协议 grpc web 是不同的 因为 由于浏览器限制 而存在 还有大量博客文章描述了为让 gRPC 在浏览器中
  • 为什么在分配给变量(别名条件)时,类属性的类型缩小检查不起作用?

    如何缩小别名条件表达式中类的属性类型 Short 在类方法中 我想进行类型缩小检查 例如this end null this head null 但我想首先将此检查的结果分配给一个变量 然后再在类型缩小中使用它if条款 它没有按预期工作 不
  • 您可以将 WebApi 2 基于属性的路由与 WebForms 一起使用吗?

    正如标题所述 我想知道是否可以将 WebAPI 2 的基于属性的路由与 WebForms 一起使用 我觉得这显然可以完成 因为您可以在 WebForms 应用程序中很好地使用 WebAPI2 我只是不知道如何启用基于属性的路由 基于此art
  • PowerShell:将 16MB CSV 导入 PowerShell 变量会创建 >600MB 的 PowerShell 内存使用量

    我试图理解为什么当我导入一个大约 16MB 的文件作为变量时 PowerShell 的内存膨胀如此之大 我可以理解该变量周围有额外的内存结构 但我只是想理解为什么它那么高 这就是我在下面所做的 只是任何人都可以运行的另一个脚本的精简简单片段