CreateTextFile 是否会在 OpenTextFile 上创建竞争条件?
Does CreateTextFile create a race condition over OpenTextFile?
我的脚本遍历 .xlsx 文件中的大量数据,并且根据该文件是否存在,creates/opens 一个与当前正在处理的数据集相关的文件。
处理确定 FileSystemObject
是否应该 create/open 文本文件的代码最终导致部分数据在 text[= 的开头重复24=] 文件。一旦更改为使用单个文件,就没有重复,这意味着处理数据提取的逻辑很好。
Set excel = CreateObject("Excel.Application")
Set excelWorkbook = excel.Workbooks.Open("C:\data.xlsx")
Set excelSheet = excelWorkbook.Worksheets(1)
Set fso = CreateObject("Scripting.FileSystemObject")
id = ""
sum = 0
row = 2
Do While row < 40500
'identifier located in column c
id = excelSheet.Range("C" & row).value
'followed by numbers in column h
'column h is empty on the row of an id
Do While Len(excelSheet.Range("H" & row+1).value) > 0
sum = excelSheet.Range("H" & row+1).value + sum
row = row + 1
Loop
WriteToText id,row,sum
sum = 0
row = row + 1
Loop
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
If fso.FileExists(fileName) Then
Set file = fso.OpenTextFile(fileName, 8)
file.WriteLine x & " " & y " " & z
file.Close
Else
Set file = fso.CreateTextFile(fileName)
file.WriteLine x & " " & y " " & z
file.Close
End If
End Sub
这是创建、处理和关闭文本文件后未释放内存 space 的结果吗?
Set file = Nothing
...导致使用 CreateTextFile
创建的缓冲区在调用 OpenTextFile
后在内存中持续存在?
如果不了解数据的来源以及提取方式,就无法判断重复数据的来源。我没有在您的代码中看到固有的竞争条件,因为 VBScript 首先不是 multi-threaded。但是,您可以通过简单地使用 OpenTextFile
方法并将第三个参数设置为 True
来避免任何与区分文件是否已经存在有关的问题。这将自动创建一个丢失的文件并附加到它。
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
fso.OpenTextFile(fileName, 8, True).WriteLine x & " " & y " " & z
End Sub
在函数内部将对象设置为 Nothing
是 almost never required,因为 VBScript 通常会自动处理它。
我的脚本遍历 .xlsx 文件中的大量数据,并且根据该文件是否存在,creates/opens 一个与当前正在处理的数据集相关的文件。
处理确定 FileSystemObject
是否应该 create/open 文本文件的代码最终导致部分数据在 text[= 的开头重复24=] 文件。一旦更改为使用单个文件,就没有重复,这意味着处理数据提取的逻辑很好。
Set excel = CreateObject("Excel.Application")
Set excelWorkbook = excel.Workbooks.Open("C:\data.xlsx")
Set excelSheet = excelWorkbook.Worksheets(1)
Set fso = CreateObject("Scripting.FileSystemObject")
id = ""
sum = 0
row = 2
Do While row < 40500
'identifier located in column c
id = excelSheet.Range("C" & row).value
'followed by numbers in column h
'column h is empty on the row of an id
Do While Len(excelSheet.Range("H" & row+1).value) > 0
sum = excelSheet.Range("H" & row+1).value + sum
row = row + 1
Loop
WriteToText id,row,sum
sum = 0
row = row + 1
Loop
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
If fso.FileExists(fileName) Then
Set file = fso.OpenTextFile(fileName, 8)
file.WriteLine x & " " & y " " & z
file.Close
Else
Set file = fso.CreateTextFile(fileName)
file.WriteLine x & " " & y " " & z
file.Close
End If
End Sub
这是创建、处理和关闭文本文件后未释放内存 space 的结果吗?
Set file = Nothing
...导致使用 CreateTextFile
创建的缓冲区在调用 OpenTextFile
后在内存中持续存在?
如果不了解数据的来源以及提取方式,就无法判断重复数据的来源。我没有在您的代码中看到固有的竞争条件,因为 VBScript 首先不是 multi-threaded。但是,您可以通过简单地使用 OpenTextFile
方法并将第三个参数设置为 True
来避免任何与区分文件是否已经存在有关的问题。这将自动创建一个丢失的文件并附加到它。
Sub WriteToText(x, y, z)
fileName = "C:\file" & x & ".txt"
fso.OpenTextFile(fileName, 8, True).WriteLine x & " " & y " " & z
End Sub
在函数内部将对象设置为 Nothing
是 almost never required,因为 VBScript 通常会自动处理它。