По мере роста выходного файла скорость записи падает. Как ускорить запись файла?Python

Программы на Python
Ответить
Anonymous
 По мере роста выходного файла скорость записи падает. Как ускорить запись файла?

Сообщение Anonymous »

У меня есть код:
saveData = {
"xyStep": xyStep,
"xRange": xRange,
"yRange": yRange,
"zRange": zRange,
"zBase": zBase,
"data": [[0] * ceil(xRange/xyStep) for i in range(ceil(yRange/xyStep))],
}

measurements = 1
pos = microscope.position
print("Current position: " + json.dumps(pos))

starting_pos = microscope.position

ix = 0
iy = 0

totalElapsed = 0
stepsTaken = 1
maxSteps = (xRange/xyStep) * (yRange/xyStep)
up = True

ix = 0
for x in range(-micronToStep(xRange/2), micronToStep(xRange/2) - micronToStep(xyStep), micronToStep(xyStep)):
iy = 0
for y in range(-micronToStep(yRange/2), micronToStep(yRange/2) - micronToStep(xyStep), micronToStep(xyStep)):
start = timer()
values = []
if (up):
pos = {}
pos['x'] = x # declination
pos['y'] = y # declination
pos['z'] = zBase - micronToStep(zRange/2)
pos['z2'] = zBase + micronToStep(zRange/2)
print("Scanning up to position:", pos)

values = microscope.measureZ(microscope, pos)
values = np.asarray(values)
thisTime = timer() - start
totalElapsed += thisTime
up = False
else:
pos = {}
pos['x'] = x # declination
pos['y'] = y # declination
pos['z'] = zBase + micronToStep(zRange/2)
pos['z2'] = zBase - micronToStep(zRange/2)
print("Scanning to position:", pos)

values = microscope.measureZ(microscope, pos)
values = np.asarray(values)
values = np.flip(values)
thisTime = timer() - start
totalElapsed += thisTime
up = True

print(pos)
saveData['data'][ix][iy] = values

iy += 1
timeLeft = (maxSteps - stepsTaken) * (totalElapsed / stepsTaken) / 60 / 60
print(">>>>>>>>>>>> Estimated time left: [" + str(timeLeft) + "hr], Per Scan: [" + str(totalElapsed / stepsTaken) + "s][" + str(thisTime) + "], Total Elapsed: [" + str(totalElapsed) + "s], Scans taken: [" + str(stepsTaken) + "] out of: [" + str(maxSteps) + "]")
stepsTaken += 1
pickle.dump(saveData, open('saveData.bin', 'wb'))

ix += 1

pickle.dump(saveData, open('saveData.bin', 'wb'))

Во время выполнения выходной файл достигает около 4 ГБ, по мере роста файла скорость записи падает.
Я использую в другом приложении файл saveData.bin, поэтому мне хотелось сохранить ту же внутреннюю структуру данных в файле.
Проблема в том, что приведенный выше код каждый раз записывает весь файл целиком, а не просто добавляет новейшие данные в конец.
Я читал о многих вариантах и Мне интересно, является ли np.memmap оптимальным решением моей проблемы. Буду очень признателен за показ правильной реализации решения. Проблема в том, что np.memmap требует всех диапазонов, но один из моих диапазонов зависит от «данных», как вы могли видеть в приведенном выше коде.
Изменить: ниже я прикрепляю код второй программы, которая загружает файл saveData.bin, написанный первой программой. Вот код:
import matplotlib.pyplot as plt
import numpy as np
import time
from PIL import Image
import math
import numpy as np
import json
import pickle
import matplotlib.cm as cm
import PIL.ImageOps
import tifffile

def micronToStep(v):
#approximately 62nm/step
return round((v * 1000)/62)

def normalizeData(data):
return (data - np.min(data)) / (np.max(data) - np.min(data))

def moving_average(x, w):
return np.convolve(x, np.ones(w), 'valid') / w

def annot_max(x,y, ax=None):
xmax = x[np.argmax(y)]
ymax = y.max()
text= "x={:.3f}, y={:.3f}".format(xmax, ymax)
if not ax:
ax=plt.gca()
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
arrowprops=dict(arrowstyle="->",connectionstyle="angle,angleA=0,angleB=60")
kw = dict(xycoords='data',textcoords="axes fraction",
arrowprops=arrowprops, bbox=bbox_props, ha="right", va="top")
ax.annotate(text, xy=(xmax, ymax), xytext=(0.94,0.96), **kw)

fo = open('saveData2.bin', 'rb')
data = pickle.load(fo)
fo.close()

print("xyStep: ", data['xyStep'])
print("xRange: ", data['xRange'])
print("yRange: ", data['yRange'])
print("zRange: ", data['zRange'])
print("zBase: ", data['zBase'])

dimX = math.ceil(data['xRange'] / data['xyStep'])
dimY = math.ceil(data['yRange'] / data['xyStep'])
print(dimX, dimY)
img = np.zeros((dimX, dimY)).astype('uint16')

zRange = data['zRange']
imgData = data['data']
minValue = 999999999
maxValue = -999999999

for i in range(0, dimX):
for j in range(0, dimY):
if type(imgData[j]) is np.ndarray:

try:
smoothed = moving_average(imgData[j], 10)
height = smoothed.argmax() # / smoothed.shape[0]) * zRange
except TypeError:
height = 0

print("Min: ", minValue)
print("Max: ", maxValue)

tifffile.imwrite('saveData2.tif', img)

Как ускорить запись файла в первой программе и загрузить его в принятом формате во вторую программу?
Edit2:
Вот код программы 1 со struct и f.write(), буду благодарен за исправления:
saveData = {
"xyStep": xyStep,
"xRange": xRange,
"yRange": yRange,
"zRange": zRange,
"zBase": zBase,
"data": [[0] * ceil(xRange/xyStep) for i in range(ceil(yRange/xyStep))],
}

with open("saveData.bin", "wb") as f:
f.write(struct.pack(
">>>>>>>>>> Estimated time left: [" + str(timeLeft) + "hr], Per Scan: [" + str(totalElapsed / stepsTaken) + "s][" + str(thisTime) + "], Total Elapsed: [" + str(totalElapsed) + "s], Scans taken: [" + str(stepsTaken) + "] out of: [" + str(maxSteps) + "]")
stepsTaken += 1

ix += 1

#pickle.dump(saveData, open('saveData.bin', 'wb'))
#pickle.dump(dataMaxPositions, open('dataMaxPositions.bin', 'wb'))

print("Homing")
pos['x'] = 0
pos['y'] = 0
pos['z'] = 0

microscope.move(pos)

# %%


Подробнее здесь: https://stackoverflow.com/questions/798 ... riting-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»