Saya memiliki program saya yang mencantumkan dan membaca semua file dalam direktori dan menghitung jumlah total catatan yang ada dalam file secara bersamaan.

Ketika saya menjalankan kode di bawah ini saya mendapatkan beberapa daftar nama utas pekerja dengan jumlah yang masuk dalam potongan karena penghitungan catatan dari beberapa file juga berjalan paralel.

import multiprocessing as mp
import time
import os
path = '/home/vaibhav/Desktop/Input_python'

def process_line(f):
    print(mp.current_process())
    #print("process id = " , os.getpid(f))
    print(sum(1 for line in f))

for filename in os.listdir(path):
    print(filename)

    if __name__ == "__main__":

        with open('/home/vaibhav/Desktop/Input_python/'+ filename, "r+") as source_file:
            # chunk the work into batches

            p = mp.Pool()
            results = p.map(process_line, source_file)

start_time = time.time()
print("My program took", time.time() - start_time, "to run")

Keluaran saat ini

<ForkProcess(ForkPoolWorker-54, started daemon)>
73
<ForkProcess(ForkPoolWorker-55, started daemon)>
<ForkProcess(ForkPoolWorker-56, started daemon)>
<ForkProcess(ForkPoolWorker-53, started daemon)>
73
1
<ForkProcess(ForkPoolWorker-53, started daemon)>
79
<ForkProcess(ForkPoolWorker-54, started daemon)>
<ForkProcess(ForkPoolWorker-56, started daemon)>
<ForkProcess(ForkPoolWorker-55, started daemon)>
79
77
77

Apakah ada cara agar saya bisa mendapatkan jumlah catatan total file seperti

File1.Txt Total_Recordcount
...
Filen.txt  Total_Recordcount

PERBARUI Saya mendapatkan solusinya dan menempelkan jawabannya di bagian komentar.

0
user7422128 18 Agustus 2017, 19:38

2 jawaban

Jawaban Terbaik

Sebelumnya saya membaca file dan memunculkan beberapa proses sekaligus untuk satu file yang menyebabkan catatan jumlah potongan file.

Tapi sekarang saya mengubah pendekatan saya, Saat ini saya melewati daftar file sebagai iterable ke fungsi pool.map() yang melepaskan beberapa proses untuk semua file yang berbeda dalam daftar dan memberi saya hasil yang lebih baik dalam hal waktu berjalan. Ini tautan dari tempat saya mengambil referensi dan di bawah ini adalah kode yang ditempel dan diperbaiki.

import multiprocessing  as mp
from multiprocessing import Pool
import os
import time
folder = '/home/vaibhav/Desktop/Input_python'

fnames = (name for name in os.listdir(folder))
def file_wc(fname):
    with open('/home/vaibhav/Desktop/Input_python/'+ fname) as f:
        count = sum(1 for line in f)
    return (fname,count)   
pool = Pool()    
print(dict(pool.map(file_wc, list(fnames))))
pool.close()
pool.join()
start_time = time.time()
print("My program took", time.time() - start_time, "to run")
0
user7422128 19 Agustus 2017, 19:17

Menghitung baris dalam file teks tidak boleh terikat pada CPU, oleh karena itu ini bukan kandidat yang baik untuk threading. Anda mungkin ingin menggunakan kumpulan utas untuk memproses beberapa file independen, tetapi untuk satu file, berikut cara menghitung baris yang seharusnya sangat cepat:

import pandas as pd
data = pd.read_table(source_file, dtype='S1', header=None, usecols=[0])
count = len(data)

Apa yang dilakukan adalah mengurai karakter pertama (S1) ke dalam DataFrame, lalu memeriksa panjangnya. Parser diimplementasikan dalam C, jadi tidak diperlukan loop Python yang lambat. Ini akan memberikan kecepatan yang mendekati kemungkinan terbaik, hanya dibatasi oleh subsistem disk Anda.

Ini menghindari masalah asli sepenuhnya, karena sekarang Anda mendapatkan satu hitungan per file.

0
John Zwinck 19 Agustus 2017, 05:16