執行緒佇列與IO操作(一)

2021-09-01 12:37:26 字數 2473 閱讀 5871

記錄,成為更好的自己

io操作相對於cpu的計算來說,速度較慢。

現在要讀2g的檔案,一次性讀取資料,消耗記憶體。一次性進行訓練。關鍵的問題在於速度慢,訓練的模型都在等資料輸入到模型中。

佇列與佇列管理器

tensorflow佇列

在訓練樣本的時候,希望讀入的訓練樣本時讀取的資料是有序的

完成乙個出佇列、+1、入佇列操作(同步操作)

# 模擬一下同步,先處理資料,然後才能取資料

#tensorflow中,執行操作有依賴性

# 1. 首先定義佇列

q = tf.fifoqueue(3, tf.float32)

# 放一些資料

enq_many = q.enqueue_many([[0.1,0.2,0.3],])

# 2.定義一些處理資料的過程,取資料的過程,取資料,+1,入佇列

out_q = q.dequeue()

data = out_q + 1

en_q = q.enqueue(data)

with tf.session() as sess:

# 初始化佇列

sess.run(enq_many)

# 處理資料

for i in range(100):

sess.run(en_q)

# 訓練資料

for i in range(q.size().eval()):

print(sess.run(q.dequeue()))

分析:當資料量很大時,入隊操作從硬碟中讀取資料,放入記憶體中,主線程需要等待入隊操作完成,才能進行訓練。會話裡可以執行多個執行緒,實現非同步讀取。

佇列管理器

其實就是建立執行緒

實現非同步操作,通過佇列管理器來實現變數加1,入隊,主線程出佇列的操作。

# 模擬非同步,子執行緒存入,主線程讀取

# 1.定義乙個佇列

q = tf.fifoqueue(1000, tf.float32)

# 2.定義要做的事情,迴圈值+1,放入佇列

var = tf.variable(0.0)

# 實現乙個變數自增

data = tf.assign_add(var, tf.constant(1.0))

en_q = q.enqueue(data)

# 3. 定義佇列管理器op,指定多少個子執行緒,子執行緒該幹什麼事情

qr = tf.train.queuerunner(q, enqueue_ops=[en_q]*2)

# 初始化變數的op

init_op = tf.global_variables_initializer()

# 開啟會話

with tf.session() as sess:

# 初始化變數

sess.run(init_op)

# 真正開啟子執行緒

threads = qr.create_threads(sess, start=true)

# 主線程,不斷讀取資料訓練

for i in range(300):

print(sess.run(q.dequeue()))

執行後結果會有乙個這樣的錯誤:

tensorflow.python.framework.errors_impl.cancellederror: enqueue operation was cancelled

[[node: fifo_queue_enqueue = queueenqueuev2[tcomponents=[dt_float], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:cpu:0"](fifo_queue, assignadd)]]

分析:這時候有乙個問題就是,入隊自顧自的去執行,在需要的出隊操作完成之後,程式沒法結束。需要乙個實現執行緒間的同步,終止其他執行緒。

執行緒協調器

通過執行緒協調器來解決如上問題。主線程已經結束了,子執行緒還在做。

with tf.session() as sess:

# 初始化變數

sess.run(init_op)

# 開啟執行緒管理器

coord = tf.train.coordinator()

# 真正開啟子執行緒

threads = qr.create_threads(sess, coord=coord, start=true)

# 主線程,不斷讀取資料訓練

for i in range(300):

print(sess.run(q.dequeue()))

# **執行緒

coord.request_stop()

coord.join(threads)

執行緒佇列與IO操作(三)

記錄,成為更好的自己 影象基本知識 如何用張量來表達?指定3 d張量 height,weight,channels 如 200,200,3 200長200寬3通道。每乙個樣本必須保持特徵值數量一樣。影象讀取api 影象讀取器 影象解碼器 讀取 def picread filelist 讀取狗並轉換成...

Tensorflow 順序佇列與IO操作

cpu負責tensorflow的計算,io負責讀取檔案 由於速度上的差異,通常做法是 主線程進行模型訓練,子執行緒讀取資料,二者通過佇列進行資料傳輸 相當於主線程從佇列讀資料,子程序往佇列放資料 在使用tensorflow進行非同步計算時,佇列是一種強大的機制。乙個簡單的例子。先建立乙個 先入先出 ...

多執行緒下的IO操作

今天考慮優化專案中檔案操作,專案中有許多批量刪除檔案的操作,當檔案很多時,刪除操作會比較費時 1s 2s的時間也顯得有點慢了 更何況10s以上,想要通過多執行緒來同時處理多個檔案的刪除,在程式中使用了threadpool和parallel想要加速刪除,但是效果並沒有預期的明顯,總耗時甚至還有所提公升...