所以我想做的事情是讓多個核心處理一些東西......
我有一個 py 腳本,它基本上為我的 ML 和 DL 模型創建了一個特征向量。現在我正在做的是我獲取一個 txt 檔案,我將它與我在運行時初始化的串列進行比較。因此,代碼獲取 txt 中的第一行并檢查該行在唯一串列中的位置以及在該位置,它在另一個串列中 1。然后將該串列附加到另一個串列,然后將其寫入 csv 檔案,但這發生在執行結束時。現在沒有執行緒,我能夠在 500 毫秒到 1.5 秒左右處理 1 個檔案。當我在我的系統上打開活動監視器時,我可以看到一次,任何 1 個核心都將被固定為 100%。但是當我做多執行緒的事情時,所有 10 個內核將只占 10% 到 20% 左右。與我的非執行緒內容相比,執行速度并沒有那么快。
我有 6464 個檔案,我的系統是 i5 8300H(4 核)或 i9 10900(10 核)
在 find_files() 中,我基本上撰寫了腳本來查找我需要的檔案。一些變數被初始化。我只是沒有把它放在這里使代碼變得復雜。現在最后,您可以看到一個執行緒輔助函式,它基本上用于將呼叫劃分為多個執行緒。
def find_files():
internal_count = 0
output_path = script_path "/output"
fam_dirs = os.listdir(output_path)
for fam_dir in fam_dirs:
if fam_dir in malware_families:
files = os.listdir(output_path "/" fam_dir "/")
for file in files:
file_path = output_path "/" fam_dir "/" file
internal_count = 1
thread_helper(file_path, file, fam_dir, internal_count)
在這里,您可以看到執行緒助手采用“計數”引數并將呼叫劃分給特定執行緒以平衡負載。我什至也嘗試過 thread.join() 。但同樣的問題。
def thread_helper(file_path, file, fam_dir, count):
if count % 4 == 0:
t4 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
t4.start()
elif count % 3 == 0:
t3 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
t3.start()
if count % 2 == 0:
t2 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
t2.start()
else:
t1 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
t1.start()
# wait until threads are completely executed
# t1.join()
# t2.join()
# t3.join()
# t4.join()
所以在這個函式中,我基本上取一個檔案,打開它,一行一行地取輸入行,看看它在唯一串列中的位置,然后 I 1 特征向量串列中與唯一串列相對應的位置的值。
def generate_feature_vector(path, file_name, family):
try:
with open(path, 'r') as file:
lines = file.read()
lines = lines.split("\n")
feature_vector = list()
# Init feature_vector to 0 with the length of the unique list of that feature
for i in range(len(feature_ls)):
feature_vector.append([0] * len(unique_ls[i]))
# 1 the value in the cell corresponding to the file_row and feature_name_column and append family name
for line in lines:
for i in range( len(feature_ls) ):
if line in unique_ls[i]:
feature_vector[i][ unique_ls[i].index(line) ] = 1
feature_vector[i][ len(feature_vector[i])-1 ] = family
我不確定我在哪里搞砸了。那么你們能幫我將負載分配給多個 CPU 內核嗎?如果我在問這個問題時弄亂了術語,也請糾正我....
uj5u.com熱心網友回復:
由于 python 的 GIL,一次只執行一個執行緒,threading只對 I/O 受限的應用程式有效,而不是 CPU 受限的應用程式,比如你的。
為了使您的程式并行化,我建議使用multiprocessing模塊,它的使用與它的使用非常相似,threading但實作了真正的并行性。
uj5u.com熱心網友回復:
正如 Joao Donasolo 所說,我嘗試了多處理。而這整段時間,我只是看錯了地方。我把多處理誤認為是多執行緒。對于我的具體問題,多處理模塊幫助了我。我還沒有運行和基準測驗來比較這些,但是一旦我能夠進行基準測驗,我就會在這里更新統計資料和代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486659.html
