我有來自樹莓派的連續資料流,我將它們附加到一個串列中。我正在實時預測輸出,現在的事情是記憶體管理,我擔心如果讓設備持續運行它會填滿串列,最終我可能會用完記憶體。有什么方法可以附加值來預測它們并繼續從串列中洗掉所有值,這些值是我當前預測(索引)之上的第 100 個預測(索引)。
i2c = board.I2C()
mpu = adafruit_mpu6050.MPU6050(i2c)
mpu_accelerometer_range = adafruit_mpu6050.Range.RANGE_4_G
data1 = []
j = 0
data2 = []
while(True):
j =1
ax,ay,az = mpu.acceleration
magnitude = np.sqrt(np.square(ax) np.square(ay) np.square(az))
data1.append([magnitude])
df = pd.DataFrame(data1)
uj5u.com熱心網友回復:
我認為一個解決方案是預測前 100 條傳入資料的值,然后啟動“while True”回圈,在回圈結束時洗掉串列的最后一項。我不熟悉您使用的庫和函式,但我認為它可能看起來像這樣:
i2c = board.I2C()
mpu = adafruit_mpu6050.MPU6050(i2c)
mpu_accelerometer_range = adafruit_mpu6050.Range.RANGE_4_G
data1 = []
j = 0
data2 = []
for i in range(100):
j =1
ax,ay,az = mpu.acceleration
magnitude = np.sqrt(np.square(ax) np.square(ay) np.square(az))
data1.append([magnitude])
df = pd.DataFrame(data1)
while(True):
j =1
ax,ay,az = mpu.acceleration
magnitude = np.sqrt(np.square(ax) np.square(ay) np.square(az))
data1.append([magnitude])
df = pd.DataFrame(data1)
data1.pop(0)
使用 pop 函式并指定串列的第一個(在 python 索引 0 中)元素,我們可以洗掉該元素。這可能看起來令人困惑,但這樣看:串列中最舊的專案總是第一個。因為我們一開始回圈了 100 次,所以你現在不斷地洗掉串列的第 100 項。
如果這不是解決方案或者您有任何問題,請告訴我。
uj5u.com熱心網友回復:
您目前這樣做:
data1 = []
j = 0
while(True):
j =1
magnitude = ... #something
data1.append([magnitude])
df = pd.DataFrame(data1)
n
相反,如果您需要存盤最大數量的值,您可以這樣做:
data1 = [None] * n
j = 0
while True:
j =1
magnitude = ... #something
data1[(j - 1) % n] = [magnitude]
df = pd.DataFrame(data1[j % n:] data1[:j % n if j % n else n])
這將使記憶體占用量保持在大約 的固定大小n
,并且在每次迭代時,將提供一個資料幀,其中包含n
按時間順序排列的最新測量值。
data1
或者,您可以通過消除和更新資料幀邏輯來簡單地執行此操作,從而比上述方法進一步優化:
# before entering loop:
df = pd.DataFrame([[None] for _ in range(n)])
# inside loop:
df.iloc[(j - 1) % n, 0] = magnitude
在上述兩種方法中(使用和不使用data1
),您要么希望下游邏輯知道尾隨空值df
表示未設定的資料(對于j
那些是 <的值n
),要么包括有意義值的數量,即min(j, n)
,在某處你的輸出。
uj5u.com熱心網友回復:
如果您擔心記憶體使用陣列可能會更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505424.html