Разделение файлов для использования нескольких потоков, множество операций чтения / записи - PullRequest
0 голосов
/ 03 февраля 2020

Я знаю, что подобные вопросы задавались, хотя ответ, похоже, сильно зависит от типа выполняемых операций, поэтому я подумал, что мне следует спросить о моем конкретном случае c здесь. Я также новичок в этом, так что простите мою неопытность.

У меня есть очень большой CSV-файл, который мне нужно обработать, около 400 миллионов строк (фактически разделенных на несколько CSV-файлов). Мой скрипт читает строку, выполняет вычисления, а затем записывает результат в отдельный выходной CSV-файл.

Каждая строка может быть вычислена независимо, поэтому я могу разбить свой файл на столько маленьких кусочков, сколько мне хотелось бы. Когда я запускаю lscpu, я получаю следующее:

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              32
On-line CPU(s) list: 0-31
Thread(s) per core:  2
Core(s) per socket:  16
Socket(s):           1
NUMA node(s):        1
Vendor ID:           AuthenticAMD
CPU family:          23
Model:               1
Model name:          AMD Ryzen Threadripper 1950X 16-Core Processor
Stepping:            1
CPU MHz:             3692.603
CPU max MHz:         3400.0000
CPU min MHz:         2200.0000
BogoMIPS:            6786.40
Virtualization:      AMD-V
L1d cache:           32K
L1i cache:           64K
L2 cache:            512K
L3 cache:            8192K
NUMA node0 CPU(s):   0-31
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca

Мой план состоял в том, чтобы разбить мой файл на N более мелких частей, а затем запустить мой процесс, запускаемый N раз (при условии, что N задач будет отправлено на разные ядра, если это возможно).

Тогда у меня вопрос: какое значение N мне выбрать? У меня 16 ядер, но по два ядра на ядро. Должен ли я запускать процессы, используя все 32 потока или только 16?

Я выполнил некоторый тестовый код для файла с 10000 строками, и вот время (где чтение / запись были синхронизированы как одна операция):

Mean read/write time = 0.0002238105
Mean compute time = 0.0724388522
Total read/write time = 2.238105
Total compute time = 724.388522

Я не знаю, сколько операций чтения / записи t ie загружает процессор, поэтому, возможно, это не имеет значения.

Могу ли я разделить его на 32 процесса и ускорить более 16 процессов? Или тот факт, что два процесса совместно используют каждое ядро, замедляет отдельные процессы до точки, где нет net ускорения?

Кроме того, если я запускаю 16 или 32 отдельных процесса (используя другой экран windows) будут ли они автоматически назначаться различным ядрам / потокам? Или мне нужно что-то сделать, чтобы их разложить?

...