У меня есть код:
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
По мере роста выходного файла скорость записи падает. Как ускорить запись файла? ⇐ Python
Программы на Python
1765924231
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[i][j]) is np.ndarray:
try:
smoothed = moving_average(imgData[i][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)
# %%
Подробнее здесь: [url]https://stackoverflow.com/questions/79844361/as-the-output-file-grows-the-write-speed-drops-how-can-i-speed-up-writing-the[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия