通常我可以在这个网站上很快找到我的困境的答案,但也许这个问题需要更具体的接触;
我从泰克示波器下载了大约 5000 万长的 unicode 字符串。分配这个对于内存来说是一件痛苦的事情(sys.getsizeof() 报告 ~100 MB)
问题在于我需要将其转换为 CSV,以便我可以获取 10,000 个逗号分隔值中的 10,000 个(这是固定的)... 1)我尝试了 split(",") 方法,使用这个, python内核上的RAM使用量又增加了300 MB ....但是这个过程非常有效(除非我在一个例程中循环这个~100次......在迭代40-50之间的某个地方,内核吐出一个内存错误.) 2) 我编写了自己的脚本,在下载了这个荒谬的长字符串后,扫描逗号的数量,直到看到 10,000 并停止,将逗号之间的所有值转换为浮点数并填充一个 np 数组。从内存使用的角度来看,这非常有效(从导入文件之前到运行脚本之后,内存使用量仅变化 150MB。)但是它慢得多,
下面是用于处理这个文件的代码,如果你 PM 我,我可以给你发一份字符串的副本以供试验(但我相信生成一个可能更容易)
代码 1(使用 split() 方法)
PPStrace = PPSinst.query('CURV?')
PPStrace = PPStrace.split(',')
PPSvals = []
for iii in range(len(PPStrace)): #does some algebra to values
PPStrace[iii] = ((float(PPStrace[iii]))-yoff)*ymult+yzero
maxes=np.empty(shape=(0,0))
iters=int(samples/1000)
for i in range(1000): #looks for max value in 10,000 sample increments, adds to "maxes"
print i
maxes = np.append(maxes,max(PPStrace[i*iters:(i+1)*iters]))
PPS = 100*np.std(maxes)/np.mean(maxes)
print PPS," % PPS Noise"
代码 2(自生成脚本);
PPStrace = PPSinst.query('CURV?')
walkerR=1
walkerL=0
length=len(PPStrace)
maxes=np.empty(shape=(0,0))
iters=int(samples/1000) #samples is 10 million, iters then is 10000
for i in range(1000):
sample=[] #initialize 10k sample list
commas=0 #commas are 0
while commas<iters: #if the number of commas found is less than 10,000, keep adding values to sample
while PPStrace[walkerR]!=unicode(","):#indexes commas for value extraction
walkerR+=1
if walkerR==length:
break
sample.append((float(str(PPStrace[walkerL:walkerR]))-yoff)*ymult+yzero)#add value between commas to sample list
walkerL=walkerR+1
walkerR+=1
commas+=1
maxes=np.append(maxes,max(sample))
PPS = 100*np.std(maxes)/np.mean(maxes)
print PPS,"% PPS Noise"
还尝试了带有 StringIO 的 Pandas Dataframe 进行 CSV 转换。那个东西只是试图将它读入框架时出现内存错误。
我认为解决方案是将其加载到 SQL 表中,然后将 CSV 提取到 10,000 个样本块中(这是脚本的预期目的)。但我不想这样做!
感谢您的所有帮助!