输出 csv 文件时,Powershell 脚本在服务器上使用大量内存

Posted

技术标签:

【中文标题】输出 csv 文件时,Powershell 脚本在服务器上使用大量内存【英文标题】:Powershell script using a lot memory on server when outputting csv file 【发布时间】:2022-01-07 01:53:17 【问题描述】:

我目前正在尝试获取包含多个子目录和文件的 128.5GB 文件夹中所有文件的最后修改日期。但是,每当脚本运行时,它几乎都会使用服务器上的所有内存。 (我认为这是因为它试图在将所有数据输出到 .csv 文件之前将其放入内存中)。有没有一种方法可以在不使用服务器上所有内存的情况下仍将数据输出到 .csv 文件中。请找到我的以下脚本:-

$results = Get-ChildItem -Force -Recurse -File -Path "C:\inetpub\wwwroot\" | Sort LastWriteTime -Descending | Select-Object FullName, LastWriteTime 

$results | Export-Csv "C:\Users\serveradmin\Documents\dates.csv" -notype 


【问题讨论】:

有多少个文件?在某些情况下,Get-Childitem 被称为 slow,而 NTFS 在处理 large number 的文件时表现不佳。 嗨 vonPryz,站点文件夹包含大约 5,721,620 个文件。 是的。您使用的是数据库,而不是 500 万个文件。文件系统不是数据库。 文件系统 is 是一个数据库,这里的问题是 OP 会在不需要时尝试将其元数据的重要块加载到内存中。您也不会从数据库中下载原始索引 :) 哦,天哪,在 NTFS 上工作超过五百万个文件将是非常痛苦的。它不是将文件内容读入内存,“仅”处理文件元数据。但是对于数百万个文件,这将需要相当大的努力。 【参考方案1】:

Powershell 可能会占用大量内存且速度很慢...所以我用 python 给你写了一个脚本。我在我的mac上测试过,很有魅力。我在剧本上留下了笔记。只需修改要扫描的文件夹路径以及要保存 csv 文件的位置。它会更快,并且使用更少的内存:o)

#Import Python Modules
import os,time
import pandas as pd

#Function to Scan files
def get_information(directory):
    file_list = []
    for i in os.listdir(directory):
        a = os.stat(os.path.join(directory,i))
        file_list.append([i,time.ctime(a.st_atime),time.ctime(a.st_ctime),time.ctime(a.st_mtime)]) #[file,most_recent_access,created]
    return file_list

#Enter Folder Path To Be Scanned
flist = get_information("/Users/username/FolderName1/FolderName2/data")
#print(flist)

#Build DataFrame Table
df = pd.DataFrame(flist)

#Insert DataFrame Table Colimns
df.columns = ['file name', 'last access time', 'last change time', 'last modification time']

#Print output as test
#print(df)

#Bulid Filepath for output
src_path ="/Users/username/FolderName1/"
csvfilename = "output.csv"
csvfile = src_path + csvfilename

#Export to CSV
df.to_csv(csvfile, index=False)

【讨论】:

【参考方案2】:

不管怎样,我在 8 分钟内成功处理了我硬盘上的所有 180 万个文件。

# 5 min
Get-ChildItem -Force -Recurse -File -ea 0 | 
Select-Object @n='lastwritetime';
e=$_.lastwritetime.tostring('yyyy MM dd HH mm ss'), fullname | 
export-csv sort.csv

# 3 min
import-csv sort.csv | Sort LastWriteTime -Descending | export-csv sort2.csv

【讨论】:

以上是关于输出 csv 文件时,Powershell 脚本在服务器上使用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

Powershell企业应用 - 第05章 编写Powershell日志系统

远程注册表项提取程序PowerShell脚本

CSV 脚本的 PowerShell 获取计数器,编码问题

将当前时间分配给powershell变量

使用Powershell将大输出从Oracle导出到CSV

Powershell Export-Csv 给出了不想要的结果