diff --git a/.gitignore b/.gitignore index 2c19aa0..830c7d8 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,5 @@ dkms.conf bin build -temp \ No newline at end of file +temp +data/benchmark \ No newline at end of file diff --git a/Makefile b/Makefile index a720be5..4f61661 100644 --- a/Makefile +++ b/Makefile @@ -16,105 +16,150 @@ TEST_BUILD_DIR = $(BUILD_DIR)/test TEST_LIST = $(TEST_SRC_LIST:%.c=%) TEST_SRC_LIST = $(notdir $(wildcard $(TEST_SRC_DIR)/*test*.c)) TEST_OBJ_LIST = $(addprefix $(TEST_BUILD_DIR)/,$(TEST_LIST:%=%.o)) +BENCH_SRC_DIR = $(SRC_DIR)/benchmark +BENCH_BUILD_DIR= $(BUILD_DIR)/benchmark +BENCH_LIST = $(BENCH_SRC_LIST:%.c=%) +BENCH_SRC_LIST = $(notdir $(wildcard $(BENCH_SRC_DIR)/*.c)) +BENCH_OBJ_LIST = $(addprefix $(BENCH_BUILD_DIR)/,$(BENCH_LIST:%=%.o)) INSTALL_DIR = /usr/local/bin DATA_DIR = ./data TEMP_DIR = ./temp +VERBOSE = 0 +ifeq ($(VERBOSE),0) + V := @ +else + V := +endif .PHONY: all -all: version build comparisons +all: build comparisons .PHONY: version version: - # make version - @$(CC) --version - @sh -c "if [ $(CC) != $(LD) ]; then $(LD) --version; fi" + $(V) $(CC) --version + $(V) sh -c "if [ $(CC) != $(LD) ]; then $(LD) --version; fi" $(BUILD_DIR)/%.o: - $(CC) -c $(CFLAG) -o $@ $(SRC_DIR)/$(notdir $(@:%.o=%.c)) + @echo "Compiling $@" + $(V) $(CC) -c $(CFLAG) -o $@ $(SRC_DIR)/$(notdir $(@:%.o=%.c)) .PHONY: compile compile: $(OBJ_LIST) .PHONY: mkdir mkdir: - # make mkdir - mkdir -p $(BUILD_DIR) - mkdir -p $(BIN_DIR) + $(V) mkdir -p $(BUILD_DIR) + $(V) mkdir -p $(BIN_DIR) .PHONY: build build: mkdir compile - # make build - $(LD) $(OBJ_LIST) -o $(BIN_DIR)/$(PROG_NAME) + @echo "Linking $(BIN_DIR)/$(PROG_NAME)" + $(V) $(LD) $(OBJ_LIST) -o $(BIN_DIR)/$(PROG_NAME) .PHONY: clean -clean: test-clean - # make clean - -rm -rf $(BIN_DIR) $(BUILD_DIR) +clean: test-clean bench-clean + $(V) -rm -rf $(BIN_DIR) $(BUILD_DIR) .PHONY: check check: - # make check - $(FILES_EXIST) $(OBJ_LIST) - $(FILES_EXIST) $(BIN_DIR)/$(PROG_NAME) + @echo "Checking object files" + $(V) $(FILES_EXIST) $(OBJ_LIST) + @echo "Checking binaries" + $(V) $(FILES_EXIST) $(BIN_DIR)/$(PROG_NAME) .PHONY: install install: build - # make install - mkdir -p $(INSTALL_DIR) - cp $(BIN_DIR)/$(PROG_NAME) $(INSTALL_DIR)/$(PROG_NAME) + $(V) mkdir -p $(INSTALL_DIR) + $(V) cp $(BIN_DIR)/$(PROG_NAME) $(INSTALL_DIR)/$(PROG_NAME) .PHONY: uninstall uninstall: - # make uninstall - rm -rf $(INSTALL_DIR)/$(PROG_NAME) + $(V) rm -rf $(INSTALL_DIR)/$(PROG_NAME) .PHONY: install-local install-local: $(PROG_NAME) - # make install-local - mkdir -p $(DESTDIR) - cp $(BIN_DIR)/$(PROG_NAME) $(DESTDIR)/$(PROG_NAME) + $(V) mkdir -p $(DESTDIR) + $(V) cp $(BIN_DIR)/$(PROG_NAME) $(DESTDIR)/$(PROG_NAME) .PHONY: uninstall-local uninstall-local: # make uninstall-local - rm -rf $(DESTDIR)/$(PROG_NAME) + $(V) rm -rf $(DESTDIR)/$(PROG_NAME) .PHONY: test -test: version clean build check test-build - # make test - # checking whether comparisons work - $(BIN_DIR)/compare-files $(BIN_DIR)/compare-files $(BIN_DIR)/compare-files - $(BIN_DIR)/compare-dirs $(BIN_DIR) $(BIN_DIR) - # preparing data directory - ./scripts/init_test.sh - $(BIN_DIR)/tests $(BIN_DIR)/$(PROG_NAME) $(DATA_DIR)/test $(TEMP_DIR)/test +test: clean build check test-build + @echo "Testing test utils" + $(V) $(BIN_DIR)/compare-files $(BIN_DIR)/compare-files $(BIN_DIR)/compare-files + $(V) $(BIN_DIR)/compare-dirs $(BIN_DIR) $(BIN_DIR) + @echo "Initialising tests" + $(V) ./scripts/init_test.sh + @echo "----- Running tests -----" + $(V) $(BIN_DIR)/tests $(BIN_DIR)/$(PROG_NAME) $(DATA_DIR)/test $(TEMP_DIR)/test + @echo "-------------------------" .PHONY: test-build test-build: test-mkdir comparisons test-compile .PHONY: test-mkdir test-mkdir: - # make test-mkdir - mkdir -p $(TEST_BUILD_DIR) + $(V) mkdir -p $(TEST_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: - $(CC) -c $(CFLAG) -o $@ $(TEST_SRC_DIR)/$(notdir $(@:%.o=%.c)) + @echo "Compiling $@" + $(V) $(CC) -c $(CFLAG) -o $@ $(TEST_SRC_DIR)/$(notdir $(@:%.o=%.c)) .PHONY: test-compile test-compile: $(TEST_OBJ_LIST) - # make test-compile - $(LD) -o $(BIN_DIR)/tests $(TEST_OBJ_LIST) + @echo "Linking $(BIN_DIR)/tests" + $(V) $(LD) -o $(BIN_DIR)/tests $(TEST_OBJ_LIST) .PHONY: test-clean test-clean: - # make test-clean - -rm -rf $(TEMP_DIR) $(TEST_BUILD_DIR) + $(V) -rm -rf $(TEMP_DIR) $(TEST_BUILD_DIR) .PHONY: comparisons comparisons: mkdir test-mkdir - # make comparisons - $(CC) -c $(CFLAG) -o $(TEST_BUILD_DIR)/compare_files.o $(TEST_SRC_DIR)/compare_files.c - $(CC) -c $(CFLAG) -o $(TEST_BUILD_DIR)/compare_directories.o $(TEST_SRC_DIR)/compare_directories.c - $(LD) -o $(BIN_DIR)/compare-files $(TEST_BUILD_DIR)/compare_files.o - $(LD) -o $(BIN_DIR)/compare-dirs $(TEST_BUILD_DIR)/compare_directories.o \ No newline at end of file + @echo "Compiling $(TEST_BUILD_DIR)/compare_files.o" + $(V) $(CC) -c $(CFLAG) -o $(TEST_BUILD_DIR)/compare_files.o $(TEST_SRC_DIR)/compare_files.c + @echo "Compiling $(TEST_BUILD_DIR)/compare_directories.o" + $(V) $(CC) -c $(CFLAG) -o $(TEST_BUILD_DIR)/compare_directories.o $(TEST_SRC_DIR)/compare_directories.c + @echo "Linking $(BIN_DIR)/compare-files" + $(V) $(LD) -o $(BIN_DIR)/compare-files $(TEST_BUILD_DIR)/compare_files.o + @echo "Linking $(BIN_DIR)/compasre-dirs" + $(V) $(LD) -o $(BIN_DIR)/compare-dirs $(TEST_BUILD_DIR)/compare_directories.o + +.PHONY: benchmark +benchmark: bench-build $(DATA_DIR)/benchmark + +.PHONY: bench-mkdir +bench-mkdir: mkdir + $(V) mkdir -p $(BENCH_BUILD_DIR) + +.PHONY: bench-clean +bench-clean: + $(V) -rm -rf $(BENCH_BUILD_DIR) $(DATA_DIR)/benchmark + +.PHONY: bench-build +bench-build: bench-mkdir bench-compile + +.PHONY: bench-compile +bench-compile: $(BENCH_OBJ_LIST) + @echo "Linking $(BIN_DIR)/generate" + $(V) $(LD) $(CFLAG) -o $(BIN_DIR)/generate $(BENCH_OBJ_LIST) + +$(BENCH_BUILD_DIR)/%.o: + @echo "Compiling $@" + $(V) $(CC) -c $(CFLAG) -o $@ $(BENCH_SRC_DIR)/$(notdir $(@:%.o=%.c)) + +$(DATA_DIR)/benchmark: + @echo "Generating data/benchmark" + $(V) scripts/generate_bench_data.py $(BIN_DIR)/generate $(DATA_DIR)/benchmark + + +$(TEST_BUILD_DIR)/%.o: + @echo "Compiling $@" + $(V) $(CC) -c $(CFLAG) -o $@ $(TEST_SRC_DIR)/$(notdir $(@:%.o=%.c)) + +$(BIN_DIR)/imartingraham: + git clone https://github.com/imartingraham/csv-split $(BIN_DIR)/imartingraham \ No newline at end of file diff --git a/benchmark/v0.0.2-1.csv b/benchmark/v0.0.2-1.csv new file mode 100644 index 0000000..0dd4b9d --- /dev/null +++ b/benchmark/v0.0.2-1.csv @@ -0,0 +1,299 @@ +command,mean,stddev,median,user,system,min,max,parameter_file +bin/csv-split -l 100 data/benchmark/2300_100_100.csv -n ./temp/split,0.15673962488699994,0.06563031467361495,0.1592951522,0.03475758999999998,0.022442259000000044,0.054609321200000005,0.6946567692,data/benchmark/2300_100_100.csv +bin/csv-split -l 100 data/benchmark/2000_100_100.csv -n ./temp/split,0.11892247960300004,0.052689036127990654,0.1444139772,0.029938720000000026,0.019387269999999988,0.047558949200000006,0.21556943620000002,data/benchmark/2000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9900.csv -n ./temp/split,0.12365857614100029,0.0013850023196402413,0.12287329720000001,0.08061733600000003,0.042796925000000006,0.1224851012,0.1306130832,data/benchmark/100_100_9900.csv +bin/csv-split -l 100 data/benchmark/100_5400_100.csv -n ./temp/split,0.07845312591900003,0.0010145450654237965,0.0778320562,0.05417429799999998,0.024112489999999993,0.0774817402,0.0838781312,data/benchmark/100_5400_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4100.csv -n ./temp/split,0.05132064042000002,0.0006962512785539658,0.051091609700000006,0.03383529299999999,0.017370385999999984,0.050536454200000004,0.055079343200000005,data/benchmark/100_100_4100.csv +bin/csv-split -l 100 data/benchmark/3300_100_100.csv -n ./temp/split,0.12466649768699994,0.043238690814107895,0.11554888270000001,0.04856440000000003,0.031214653999999988,0.0780892062,0.27622360320000006,data/benchmark/3300_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7600.csv -n ./temp/split,0.09337980060900011,0.0010586883573754494,0.0929890352,0.06220767299999999,0.030944407000000004,0.0921503122,0.10320478720000001,data/benchmark/100_100_7600.csv +bin/csv-split -l 100 data/benchmark/6100_100_100.csv -n ./temp/split,0.19210833416800005,0.023394676548268597,0.1855978362,0.08983894000000009,0.056866660999999964,0.1438019032,0.4312173872,data/benchmark/6100_100_100.csv +bin/csv-split -l 100 data/benchmark/100_8000_100.csv -n ./temp/split,0.11518928292900008,0.0011042104505544334,0.1147507242,0.07979591199999993,0.03513753600000002,0.1139643362,0.12255250720000001,data/benchmark/100_8000_100.csv +bin/csv-split -l 100 data/benchmark/3400_100_100.csv -n ./temp/split,0.10423960816000012,0.011482623360758679,0.1031258832,0.05026053899999998,0.03224892500000001,0.0807512622,0.1838679342,data/benchmark/3400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_500_100.csv -n ./temp/split,0.008011090406999998,0.0005130318407500726,0.0077486887,0.0055361590000000006,0.0024470809999999994,0.0075323692,0.011489196200000001,data/benchmark/100_500_100.csv +bin/csv-split -l 100 data/benchmark/2900_100_100.csv -n ./temp/split,0.08724159968,0.018389524958910393,0.0753792012,0.042705877000000024,0.027162093999999967,0.0681677332,0.1881537242,data/benchmark/2900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5100.csv -n ./temp/split,0.062926203295,0.0010689333534906343,0.06245472170000001,0.04188491699999999,0.02089059099999998,0.062069307200000014,0.0696530412,data/benchmark/100_100_5100.csv +bin/csv-split -l 100 data/benchmark/7200_100_100.csv -n ./temp/split,0.2267174676929999,0.021818853317167874,0.23540311070000003,0.10563168399999988,0.06651705300000002,0.1690123522,0.35728054620000005,data/benchmark/7200_100_100.csv +bin/csv-split -l 100 data/benchmark/9200_100_100.csv -n ./temp/split,0.29002736570100013,0.02300401314507374,0.29089518570000006,0.1346744419999999,0.08497683599999996,0.2150359142,0.43846736720000007,data/benchmark/9200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_4500_100.csv -n ./temp/split,0.06497085027300004,0.0009423131546945272,0.06441499519999999,0.045417112000000044,0.019420600999999996,0.0641110312,0.0715783882,data/benchmark/100_4500_100.csv +bin/csv-split -l 100 data/benchmark/100_7000_100.csv -n ./temp/split,0.10017236440400008,0.0010615298249541,0.0996023067,0.07032524199999995,0.029657160999999967,0.0990358852,0.1064058112,data/benchmark/100_7000_100.csv +bin/csv-split -l 100 data/benchmark/100_3400_100.csv -n ./temp/split,0.049314239206000005,0.0007827053175687814,0.04892798370000001,0.03421552899999996,0.014983288000000016,0.048591157200000006,0.05664059920000001,data/benchmark/100_3400_100.csv +bin/csv-split -l 100 data/benchmark/100_2200_100.csv -n ./temp/split,0.032306680215000015,0.0006042760012166059,0.032026600200000005,0.022410642999999994,0.00981198799999999,0.031781278200000006,0.04063094020000001,data/benchmark/100_2200_100.csv +bin/csv-split -l 100 data/benchmark/100_5800_100.csv -n ./temp/split,0.08337861680099996,0.0009878752960289265,0.0828628867,0.058332296999999964,0.024880129999999983,0.0822277052,0.0895222512,data/benchmark/100_5800_100.csv +bin/csv-split -l 100 data/benchmark/100_7300_100.csv -n ./temp/split,0.10459706479699991,0.001166114184940907,0.1039457297,0.07266828299999993,0.03173224500000002,0.1032039922,0.10813837920000001,data/benchmark/100_7300_100.csv +bin/csv-split -l 100 data/benchmark/5100_100_100.csv -n ./temp/split,0.1574839264330001,0.013171742456169746,0.1573815092,0.074990894,0.047165546000000017,0.12021797320000001,0.2042939252,data/benchmark/5100_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2400.csv -n ./temp/split,0.030141755742000013,0.0007504017542015181,0.0300749232,0.020156119999999993,0.00989299200000001,0.029525986200000003,0.03810979020000001,data/benchmark/100_100_2400.csv +bin/csv-split -l 100 data/benchmark/100_3800_100.csv -n ./temp/split,0.054727766702999885,0.0009055944035779221,0.054191408700000006,0.03837902499999998,0.016227689000000003,0.054047056200000006,0.0613016122,data/benchmark/100_3800_100.csv +bin/csv-split -l 100 data/benchmark/100_3700_100.csv -n ./temp/split,0.05350434278900007,0.0006690435647482104,0.053743875200000006,0.03750592799999999,0.01588013400000001,0.0525964022,0.06054098620000001,data/benchmark/100_3700_100.csv +bin/csv-split -l 100 data/benchmark/100_5600_100.csv -n ./temp/split,0.080411203127,0.0008967495516655681,0.0799360857,0.05571755200000004,0.024529796000000006,0.0794064662,0.0862030182,data/benchmark/100_5600_100.csv +bin/csv-split -l 100 data/benchmark/3200_100_100.csv -n ./temp/split,0.097275807278,0.015573966198806938,0.0980403797,0.047306994,0.030104294000000018,0.0756152122,0.1829002632,data/benchmark/3200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_2500_100.csv -n ./temp/split,0.03709036585600002,0.0008539138491186685,0.0367592367,0.025647412,0.011336966999999991,0.0363657932,0.044197591200000004,data/benchmark/100_2500_100.csv +bin/csv-split -l 100 data/benchmark/100_100_8000.csv -n ./temp/split,0.09739277742000012,0.0013367766016210594,0.0966521742,0.06499638700000007,0.03220705299999997,0.09614421620000001,0.1046379312,data/benchmark/100_100_8000.csv +bin/csv-split -l 100 data/benchmark/100_100_4900.csv -n ./temp/split,0.06093105965299998,0.0010346135545966277,0.06071844220000001,0.040477722000000015,0.02031471599999999,0.05995646820000001,0.0686646882,data/benchmark/100_100_4900.csv +bin/csv-split -l 100 data/benchmark/100_6800_100.csv -n ./temp/split,0.09709606008000006,0.0010744461075791628,0.0964264352,0.06775273699999997,0.02914938999999999,0.0961949472,0.1037242322,data/benchmark/100_6800_100.csv +bin/csv-split -l 100 data/benchmark/600_100_100.csv -n ./temp/split,0.014364034821000002,0.0005757498874666788,0.014420215200000001,0.008708476999999994,0.005598491000000004,0.013593825200000001,0.0191644162,data/benchmark/600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_9600_100.csv -n ./temp/split,0.13715729869599996,0.001380222986425655,0.1363019117,0.09636908399999997,0.04053235999999996,0.1358485582,0.1420997022,data/benchmark/100_9600_100.csv +bin/csv-split -l 100 data/benchmark/800_100_100.csv -n ./temp/split,0.019343241011000014,0.00231489882787192,0.019003368700000002,0.011704139000000014,0.007337091000000005,0.0182973182,0.05041343620000001,data/benchmark/800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4300.csv -n ./temp/split,0.052678628857999996,0.0009106514494605627,0.05223428670000001,0.035262461999999994,0.017296645999999992,0.05180970520000001,0.060065998200000005,data/benchmark/100_100_4300.csv +bin/csv-split -l 100 data/benchmark/5300_100_100.csv -n ./temp/split,0.16502094334000003,0.016178837199139432,0.1628921057,0.07783653099999982,0.048890380999999934,0.1241816822,0.29729492920000006,data/benchmark/5300_100_100.csv +bin/csv-split -l 100 data/benchmark/100_5900_100.csv -n ./temp/split,0.08434831253399991,0.0013038916635820278,0.08359876420000001,0.05941153000000004,0.024754490999999986,0.0832454512,0.0938244492,data/benchmark/100_5900_100.csv +bin/csv-split -l 100 data/benchmark/100_2800_100.csv -n ./temp/split,0.04083455351700008,0.0007989923006693499,0.040877423200000006,0.028273836999999975,0.012462573999999988,0.040070738200000004,0.046631123200000006,data/benchmark/100_2800_100.csv +bin/csv-split -l 100 data/benchmark/100_3500_100.csv -n ./temp/split,0.050734715102000005,0.0008760159528025997,0.050831471200000006,0.035617038999999975,0.01500148199999999,0.049829716200000006,0.05728786720000001,data/benchmark/100_3500_100.csv +bin/csv-split -l 100 data/benchmark/3900_100_100.csv -n ./temp/split,0.11987781222499999,0.016178392447987557,0.1209803797,0.057198916999999995,0.03602227799999997,0.0915203722,0.26002796320000005,data/benchmark/3900_100_100.csv +bin/csv-split -l 100 data/benchmark/5400_100_100.csv -n ./temp/split,0.16746232850499967,0.013917352496992491,0.1687323987,0.07913655499999989,0.051221222000000025,0.1274771472,0.22285779220000002,data/benchmark/5400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_5000_100.csv -n ./temp/split,0.07291522217599994,0.0012629901993253924,0.0727235762,0.05071878399999991,0.022041511999999996,0.0716805082,0.0820203332,data/benchmark/100_5000_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2000.csv -n ./temp/split,0.025493954878999983,0.0008193330011526145,0.0253612317,0.016886712999999998,0.008532657999999995,0.0246536212,0.032407296200000005,data/benchmark/100_100_2000.csv +bin/csv-split -l 100 data/benchmark/100_600_100.csv -n ./temp/split,0.009712994917,0.0005954159153300818,0.0098540902,0.006600152999999996,0.003078141300000002,0.0089686882,0.0138459092,data/benchmark/100_600_100.csv +bin/csv-split -l 100 data/benchmark/4500_100_100.csv -n ./temp/split,0.13784672515599997,0.014130521230322733,0.1353061362,0.06616262999999999,0.042258967999999966,0.1061082712,0.2172038152,data/benchmark/4500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6300.csv -n ./temp/split,0.07692229380299999,0.0009969872361686363,0.0763056782,0.051416403000000034,0.025347347999999974,0.0759299452,0.0839198292,data/benchmark/100_100_6300.csv +bin/csv-split -l 100 data/benchmark/100_2400_100.csv -n ./temp/split,0.03544707855500004,0.0008398447357980851,0.03543829970000001,0.024167813999999944,0.011182183999999984,0.03467770020000001,0.043338118200000005,data/benchmark/100_2400_100.csv +bin/csv-split -l 100 data/benchmark/1600_100_100.csv -n ./temp/split,0.04403026646400003,0.009246873175827975,0.038667802700000004,0.023576650999999994,0.015040111000000009,0.0374706512,0.08526782520000001,data/benchmark/1600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7500.csv -n ./temp/split,0.09086332543099992,0.0010101267983073409,0.0902690142,0.06119115000000004,0.029501738999999985,0.0900306762,0.0989286212,data/benchmark/100_100_7500.csv +bin/csv-split -l 100 data/benchmark/100_3300_100.csv -n ./temp/split,0.04786730141399998,0.0008323233453594906,0.047461422200000006,0.03340946400000004,0.01434085499999997,0.04715023720000001,0.054970613200000004,data/benchmark/100_3300_100.csv +bin/csv-split -l 100 data/benchmark/100_9000_100.csv -n ./temp/split,0.12892521230300003,0.001523910979970144,0.1280480757,0.09035964199999995,0.03832131800000001,0.1264595992,0.1360476032,data/benchmark/100_9000_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3900.csv -n ./temp/split,0.04839363584700001,0.0009446294539016177,0.04806613820000001,0.032485753000000055,0.015788912999999988,0.04751221320000001,0.05691699120000001,data/benchmark/100_100_3900.csv +bin/csv-split -l 100 data/benchmark/100_8800_100.csv -n ./temp/split,0.12651974798899976,0.0013901891101476805,0.1256373017,0.08830961500000008,0.037974171000000015,0.1251989892,0.1328640302,data/benchmark/100_8800_100.csv +bin/csv-split -l 100 data/benchmark/3800_100_100.csv -n ./temp/split,0.1165912234759999,0.011753833890817742,0.11349387420000001,0.05615357299999999,0.03573240399999999,0.0902900732,0.20293721720000002,data/benchmark/3800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_3100_100.csv -n ./temp/split,0.04509263553199995,0.0007421864753679443,0.04477751420000001,0.031459344999999986,0.013519642000000004,0.044414528200000004,0.05219423620000001,data/benchmark/100_3100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_800.csv -n ./temp/split,0.011179392277999979,0.0006329823915058287,0.0112748217,0.0075220479999999895,0.0036140299999999972,0.0102492082,0.0154584272,data/benchmark/100_100_800.csv +bin/csv-split -l 100 data/benchmark/100_7100_100.csv -n ./temp/split,0.10258079685099986,0.0012430136625951945,0.10187030020000001,0.07162004399999991,0.030768018000000015,0.1013664892,0.1102599942,data/benchmark/100_7100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_400.csv -n ./temp/split,0.005546341788000002,0.0003111812217926632,0.005425999200000001,0.0037140793500000046,0.0018573532999999994,0.0053113252,0.0078366372,data/benchmark/100_100_400.csv +bin/csv-split -l 100 data/benchmark/100_100_1100.csv -n ./temp/split,0.01454286423300001,0.0007432440061968355,0.014223490200000001,0.009552627000000008,0.004941596699999999,0.013949053200000002,0.019553286200000002,data/benchmark/100_100_1100.csv +bin/csv-split -l 100 data/benchmark/100_100_200.csv -n ./temp/split,0.003155828417999999,0.00039045024519554847,0.0029933252000000003,0.0021125330049999963,0.0010929110999999992,0.0027906962,0.005187239200000001,data/benchmark/100_100_200.csv +bin/csv-split -l 100 data/benchmark/100_5100_100.csv -n ./temp/split,0.07343990771900001,0.0009888267549475636,0.07296916719999999,0.05122646700000002,0.022054673999999993,0.0728177762,0.0818946822,data/benchmark/100_5100_100.csv +bin/csv-split -l 100 data/benchmark/1300_100_100.csv -n ./temp/split,0.034208535947999975,0.009641318942728435,0.030844916700000002,0.01884478100000001,0.012033149999999994,0.0302568142,0.0822530652,data/benchmark/1300_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7800.csv -n ./temp/split,0.09537557022100007,0.0014902884754795268,0.0944918102,0.06362279300000002,0.03157190699999997,0.0938108342,0.1031152962,data/benchmark/100_100_7800.csv +bin/csv-split -l 100 data/benchmark/100_100_8400.csv -n ./temp/split,0.10233395980599996,0.0013233210341699509,0.10173512770000001,0.06890975900000001,0.03323311799999999,0.1011007672,0.1111330242,data/benchmark/100_100_8400.csv +bin/csv-split -l 100 data/benchmark/100_100_4200.csv -n ./temp/split,0.05160423407499999,0.0008905301705792244,0.05101151370000001,0.034394185999999966,0.017094148999999982,0.050824920200000005,0.058972870200000006,data/benchmark/100_100_4200.csv +bin/csv-split -l 100 data/benchmark/100_100_2700.csv -n ./temp/split,0.03366945504200003,0.0006463050766227159,0.033405161700000005,0.02257719099999998,0.010999874,0.03304041320000001,0.039280290200000005,data/benchmark/100_100_2700.csv +bin/csv-split -l 100 data/benchmark/100_100_8500.csv -n ./temp/split,0.10339372528500003,0.001112457996543139,0.1028371072,0.070077126,0.03311517000000003,0.1022167962,0.1087490882,data/benchmark/100_100_8500.csv +bin/csv-split -l 100 data/benchmark/5900_100_100.csv -n ./temp/split,0.18310412016200017,0.018362573334141694,0.17787200920000001,0.08655272600000015,0.05440616300000001,0.13896010620000002,0.30770475720000007,data/benchmark/5900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7700.csv -n ./temp/split,0.09355102925599994,0.001232201909163913,0.0929095942,0.063253731,0.030108356000000044,0.0922560972,0.10215274120000001,data/benchmark/100_100_7700.csv +bin/csv-split -l 100 data/benchmark/100_8700_100.csv -n ./temp/split,0.12447307891400025,0.0015997606932678266,0.1237300722,0.08768114999999997,0.036544915999999976,0.12276034820000001,0.1323837982,data/benchmark/100_8700_100.csv +bin/csv-split -l 100 data/benchmark/100_6600_100.csv -n ./temp/split,0.09401040121800001,0.001144838494262755,0.0933564687,0.06613484000000008,0.027695176999999977,0.0930395292,0.1021141322,data/benchmark/100_6600_100.csv +bin/csv-split -l 100 data/benchmark/7400_100_100.csv -n ./temp/split,0.23206716646500006,0.024007718090903966,0.23323716020000002,0.10862776500000022,0.06856971699999984,0.1734070482,0.38449127720000004,data/benchmark/7400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_100.csv -n ./temp/split,0.0017498898229999997,0.000291020842779181,0.0016307097000000004,0.0012337529350000026,0.0006625404000000007,0.0015732552,0.0034703692000000006,data/benchmark/100_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9100.csv -n ./temp/split,0.11026470502200017,0.0015723451896052028,0.1094624297,0.07384738600000003,0.03620136399999998,0.1089694372,0.1208090812,data/benchmark/100_100_9100.csv +bin/csv-split -l 100 data/benchmark/7100_100_100.csv -n ./temp/split,0.22257359728299977,0.016194182727075762,0.2250279427,0.10437782399999994,0.06697834900000003,0.1682207652,0.2880300612,data/benchmark/7100_100_100.csv +bin/csv-split -l 100 data/benchmark/7000_100_100.csv -n ./temp/split,0.21968874100799995,0.01611613766207431,0.22121569070000002,0.10318938299999993,0.06631468199999997,0.1656033572,0.28081198420000003,data/benchmark/7000_100_100.csv +bin/csv-split -l 100 data/benchmark/9400_100_100.csv -n ./temp/split,0.29584642347799955,0.022692252157588532,0.3005149972000001,0.137873358,0.08909509600000018,0.2226244822,0.40245772920000006,data/benchmark/9400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_2600_100.csv -n ./temp/split,0.03812524668999996,0.0004721995690340074,0.03788335270000001,0.026249988999999994,0.011785315999999995,0.03756565220000001,0.040312091200000004,data/benchmark/100_2600_100.csv +bin/csv-split -l 100 data/benchmark/100_100_8600.csv -n ./temp/split,0.105564731706,0.0012493822815042835,0.1047057817,0.07017802300000002,0.035185172999999965,0.1043943472,0.1119735672,data/benchmark/100_100_8600.csv +bin/csv-split -l 100 data/benchmark/9700_100_100.csv -n ./temp/split,0.3055878153209997,0.02290009140696347,0.3092657622,0.14284232100000016,0.09145350700000004,0.2286660862,0.38395674820000003,data/benchmark/9700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_1900_100.csv -n ./temp/split,0.027994627203999978,0.000501957998814566,0.0277727667,0.01930407200000001,0.008605944000000008,0.0275923892,0.032406386200000005,data/benchmark/100_1900_100.csv +bin/csv-split -l 100 data/benchmark/1000_100_100.csv -n ./temp/split,0.02478550597300001,0.003330808939101343,0.024091964700000003,0.014598390999999983,0.009222296000000003,0.0230862062,0.0679135482,data/benchmark/1000_100_100.csv +bin/csv-split -l 100 data/benchmark/6600_100_100.csv -n ./temp/split,0.2049001967859999,0.01737795196015836,0.20457798770000002,0.09733319300000005,0.06254762700000005,0.1562050112,0.25954184920000006,data/benchmark/6600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_1500_100.csv -n ./temp/split,0.022563888763,0.0007199841190314668,0.022247968200000003,0.015303307000000006,0.007194323999999995,0.022036356200000003,0.0293292232,data/benchmark/100_1500_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7200.csv -n ./temp/split,0.08806050802599999,0.0009371579666750489,0.0876302992,0.0588704210000001,0.029020050000000013,0.0870920022,0.0928136492,data/benchmark/100_100_7200.csv +bin/csv-split -l 100 data/benchmark/7300_100_100.csv -n ./temp/split,0.2293905325159999,0.01685907697118852,0.22864734920000002,0.10729089000000006,0.06861271100000002,0.1720101092,0.32766113320000007,data/benchmark/7300_100_100.csv +bin/csv-split -l 100 data/benchmark/10000_100_100.csv -n ./temp/split,0.3155837604570003,0.026219528725545036,0.31649597920000005,0.14714823600000007,0.093244177,0.2348241452,0.41182134020000005,data/benchmark/10000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5400.csv -n ./temp/split,0.06581908611500002,0.0009677261161479057,0.0653008792,0.04384149500000001,0.02184061500000003,0.0649970012,0.0733270002,data/benchmark/100_100_5400.csv +bin/csv-split -l 100 data/benchmark/100_100_7100.csv -n ./temp/split,0.08640621780400001,0.0014092480271091416,0.0855484997,0.057797731000000054,0.028439311000000002,0.08518047720000001,0.0961988102,data/benchmark/100_100_7100.csv +bin/csv-split -l 100 data/benchmark/100_7200_100.csv -n ./temp/split,0.10324852029499998,0.001331240753936966,0.10252576020000001,0.07230087600000003,0.030753733000000005,0.1021385792,0.11117637820000001,data/benchmark/100_7200_100.csv +bin/csv-split -l 100 data/benchmark/100_100_300.csv -n ./temp/split,0.004398304225000002,0.00043271782007900546,0.0041685142,0.0029435217400000007,0.0014811466000000022,0.0040605472,0.0070873051999999995,data/benchmark/100_100_300.csv +bin/csv-split -l 100 data/benchmark/100_100_10000.csv -n ./temp/split,0.12256310359299995,0.001252379171811524,0.1220257072,0.0816765219999999,0.04066136600000006,0.1212675862,0.1306114732,data/benchmark/100_100_10000.csv +bin/csv-split -l 100 data/benchmark/100_3200_100.csv -n ./temp/split,0.046435234275000015,0.0006924707010144516,0.04608021170000001,0.032131501000000014,0.014198608999999994,0.04581836920000001,0.052613338200000005,data/benchmark/100_3200_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2100.csv -n ./temp/split,0.026800059642000027,0.0009054259908502483,0.026624926200000003,0.017754496000000005,0.008961647999999984,0.0259715532,0.0345795762,data/benchmark/100_100_2100.csv +bin/csv-split -l 100 data/benchmark/100_100_4500.csv -n ./temp/split,0.05534869125300002,0.0009828292132848487,0.05471506520000001,0.03690199799999995,0.018329681999999962,0.05441089620000001,0.06151977720000001,data/benchmark/100_100_4500.csv +bin/csv-split -l 100 data/benchmark/100_200_100.csv -n ./temp/split,0.003375130219999994,0.00033803658470572866,0.0032666292,0.0023874663050000005,0.0010404713000000008,0.0030424492000000005,0.0054642762,data/benchmark/100_200_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3400.csv -n ./temp/split,0.0419262493650001,0.0006897924713853988,0.04149997870000001,0.027990434000000015,0.013838298999999981,0.04126121120000001,0.04624583620000001,data/benchmark/100_100_3400.csv +bin/csv-split -l 100 data/benchmark/100_6200_100.csv -n ./temp/split,0.08914597258099995,0.0011192651776991064,0.08894693570000001,0.06263666399999998,0.026335344000000007,0.08783232220000001,0.0954459032,data/benchmark/100_6200_100.csv +bin/csv-split -l 100 data/benchmark/100_5700_100.csv -n ./temp/split,0.08197654658099995,0.0009949295960954684,0.0814177692,0.05745170900000002,0.02436276399999999,0.0808896782,0.0883373292,data/benchmark/100_5700_100.csv +bin/csv-split -l 100 data/benchmark/8500_100_100.csv -n ./temp/split,0.26585198028000034,0.021335422176899356,0.26650624720000005,0.12500000300000022,0.08033505699999995,0.2008807182,0.3553710312,data/benchmark/8500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5800.csv -n ./temp/split,0.07113555440200003,0.0010363194168380066,0.0704887692,0.04744318099999994,0.02354357499999999,0.0700226982,0.0769059302,data/benchmark/100_100_5800.csv +bin/csv-split -l 100 data/benchmark/100_100_5500.csv -n ./temp/split,0.06724304433499996,0.0011395468532780953,0.0664476147,0.045018519999999944,0.02207936600000005,0.0661508232,0.0742804142,data/benchmark/100_100_5500.csv +bin/csv-split -l 100 data/benchmark/7600_100_100.csv -n ./temp/split,0.23686791221099987,0.02061109558037238,0.2402693152,0.11162066299999998,0.0717268059999999,0.17969540320000002,0.33698271820000003,data/benchmark/7600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_4700_100.csv -n ./temp/split,0.06860661784800004,0.0007538330736493099,0.0688231127,0.04746306200000008,0.02099868699999998,0.0675864122,0.0720449362,data/benchmark/100_4700_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6100.csv -n ./temp/split,0.07489939055999999,0.0008428106368796313,0.07440109719999999,0.05012709800000004,0.024628884999999986,0.0739169682,0.0796045942,data/benchmark/100_100_6100.csv +bin/csv-split -l 100 data/benchmark/100_100_8100.csv -n ./temp/split,0.09889564337699995,0.0016115639046031974,0.09789690770000001,0.06598746200000002,0.03271120199999999,0.0975217712,0.1090493512,data/benchmark/100_100_8100.csv +bin/csv-split -l 100 data/benchmark/9600_100_100.csv -n ./temp/split,0.3020911885250005,0.023469032465124728,0.3037547342000001,0.14106018000000006,0.09048905800000004,0.22715066120000002,0.42020274720000006,data/benchmark/9600_100_100.csv +bin/csv-split -l 100 data/benchmark/9800_100_100.csv -n ./temp/split,0.30712338199099976,0.028553499513427408,0.31068985920000003,0.14414154999999987,0.09291214900000008,0.2310861442,0.5272085732,data/benchmark/9800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_700_100.csv -n ./temp/split,0.011225257341000001,0.0005893688642756188,0.0112521662,0.007731768999999996,0.003454838499999996,0.0104931072,0.0142534452,data/benchmark/100_700_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3500.csv -n ./temp/split,0.04358249296900004,0.0007947930008223888,0.0433854392,0.028835162999999994,0.014637946999999988,0.0427427552,0.05117944020000001,data/benchmark/100_100_3500.csv +bin/csv-split -l 100 data/benchmark/100_5300_100.csv -n ./temp/split,0.07592889362999994,0.0012719835478071319,0.0752845132,0.05330851199999993,0.022450669999999975,0.0750277152,0.0855908732,data/benchmark/100_5300_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4800.csv -n ./temp/split,0.05891624001500004,0.0009481363283848897,0.05844044770000001,0.03923308800000002,0.01954923799999999,0.058253769200000007,0.0681653162,data/benchmark/100_100_4800.csv +bin/csv-split -l 100 data/benchmark/100_100_8200.csv -n ./temp/split,0.10036530130199985,0.00138770169954757,0.09953401170000001,0.06696436300000003,0.03319905799999998,0.0986474272,0.10458203320000001,data/benchmark/100_100_8200.csv +bin/csv-split -l 100 data/benchmark/100_9100_100.csv -n ./temp/split,0.13121716422400004,0.0014420690725273461,0.1303707772,0.09184458599999991,0.03913293599999998,0.1297055342,0.1360522602,data/benchmark/100_9100_100.csv +bin/csv-split -l 100 data/benchmark/900_100_100.csv -n ./temp/split,0.02197606530400001,0.002489321877638288,0.0217173277,0.013195960999999985,0.008514952000000001,0.0207859512,0.0763669312,data/benchmark/900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1300.csv -n ./temp/split,0.017150373857000013,0.0007556646233413318,0.0167879097,0.011392452000000016,0.005704076000000002,0.016398422200000002,0.023356465200000003,data/benchmark/100_100_1300.csv +bin/csv-split -l 100 data/benchmark/100_2000_100.csv -n ./temp/split,0.029397556859000015,0.0005976878855471132,0.029307223200000003,0.020309080999999986,0.009008384999999992,0.028795966200000002,0.03245652820000001,data/benchmark/100_2000_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4600.csv -n ./temp/split,0.05614837020000012,0.0008549694845950653,0.05567936570000001,0.037418182999999966,0.01860984900000002,0.05550933420000001,0.0644387912,data/benchmark/100_100_4600.csv +bin/csv-split -l 100 data/benchmark/100_100_7900.csv -n ./temp/split,0.09588364569400017,0.0013513453645131825,0.0951794172,0.06444049100000003,0.03125551,0.0946449872,0.1019676132,data/benchmark/100_100_7900.csv +bin/csv-split -l 100 data/benchmark/100_2300_100.csv -n ./temp/split,0.033722784586000004,0.0007617776304043352,0.0333828907,0.023509312000000025,0.010117548999999998,0.0331757962,0.04178538920000001,data/benchmark/100_2300_100.csv +bin/csv-split -l 100 data/benchmark/4400_100_100.csv -n ./temp/split,0.13484259334900003,0.014461672018019567,0.1313054132,0.064968068,0.041592355999999976,0.1044708082,0.21746797720000002,data/benchmark/4400_100_100.csv +bin/csv-split -l 100 data/benchmark/1500_100_100.csv -n ./temp/split,0.04164506218199996,0.00913485909368606,0.0365751052,0.022156840999999997,0.014253342999999991,0.035406616200000005,0.0877036362,data/benchmark/1500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_500.csv -n ./temp/split,0.007023537676,0.0005600476946867734,0.0067481732,0.004577750869999999,0.0024266733000000013,0.0065394332,0.0104490522,data/benchmark/100_100_500.csv +bin/csv-split -l 100 data/benchmark/4300_100_100.csv -n ./temp/split,0.13142296732199998,0.013635664585807387,0.1295038087,0.063321293,0.040790530000000026,0.1016245052,0.2207358352,data/benchmark/4300_100_100.csv +bin/csv-split -l 100 data/benchmark/7800_100_100.csv -n ./temp/split,0.24433812134500013,0.02387339312071309,0.2476555937,0.11433914699999985,0.07391768999999992,0.18429323920000001,0.49624648220000006,data/benchmark/7800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_800_100.csv -n ./temp/split,0.012624362401999992,0.0006934154182940179,0.0122630132,0.00844311400000001,0.004128459100000002,0.011902473200000001,0.017566202200000002,data/benchmark/100_800_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2900.csv -n ./temp/split,0.036262098443000025,0.0006709908169954891,0.036304439200000004,0.024031144000000056,0.012136555,0.03552708820000001,0.042982641200000005,data/benchmark/100_100_2900.csv +bin/csv-split -l 100 data/benchmark/7700_100_100.csv -n ./temp/split,0.24060446498299992,0.022271152132069875,0.24382269620000002,0.11284569799999995,0.07353116900000002,0.1826998152,0.44232122120000006,data/benchmark/7700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_5200_100.csv -n ./temp/split,0.07473576999999998,0.0011079557278096763,0.07409835719999999,0.051042318,0.023540905999999986,0.0736970192,0.0828733762,data/benchmark/100_5200_100.csv +bin/csv-split -l 100 data/benchmark/100_9400_100.csv -n ./temp/split,0.13496436358000002,0.001284990201295747,0.13431445670000003,0.0941108090000001,0.04061800999999998,0.1334844182,0.1386691222,data/benchmark/100_9400_100.csv +bin/csv-split -l 100 data/benchmark/2100_100_100.csv -n ./temp/split,0.060213275502,0.014784904291138719,0.05094358970000001,0.030917754000000026,0.019655960999999975,0.049194710200000005,0.1168279792,data/benchmark/2100_100_100.csv +bin/csv-split -l 100 data/benchmark/100_2900_100.csv -n ./temp/split,0.042242705453999996,0.0006172471021161623,0.04200040570000001,0.029457833000000003,0.012686473999999996,0.04161040020000001,0.048168253200000004,data/benchmark/100_2900_100.csv +bin/csv-split -l 100 data/benchmark/100_4100_100.csv -n ./temp/split,0.059107799190999934,0.0006148152340976936,0.058849519200000006,0.04143650100000003,0.017544650000000002,0.05845729920000001,0.06210066820000001,data/benchmark/100_4100_100.csv +bin/csv-split -l 100 data/benchmark/100_1800_100.csv -n ./temp/split,0.02672001412300002,0.0008321403723329612,0.0265646187,0.018525912000000005,0.008107124999999996,0.026029133200000002,0.03339206520000001,data/benchmark/100_1800_100.csv +bin/csv-split -l 100 data/benchmark/100_100_8800.csv -n ./temp/split,0.10743314024799987,0.001313743888484065,0.1068754417,0.0720155829999999,0.035202815000000026,0.1062974552,0.1174787822,data/benchmark/100_100_8800.csv +bin/csv-split -l 100 data/benchmark/2600_100_100.csv -n ./temp/split,0.07722734911300012,0.018283372826801435,0.0631764292,0.03813249599999996,0.024202450000000025,0.0610704102,0.1308770742,data/benchmark/2600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4400.csv -n ./temp/split,0.054137151700999926,0.0010312568875479723,0.05453733070000001,0.036167831,0.017853529999999992,0.05305916320000001,0.0608945212,data/benchmark/100_100_4400.csv +bin/csv-split -l 100 data/benchmark/100_100_1500.csv -n ./temp/split,0.019724276305000028,0.0008141369075420714,0.019660359199999998,0.013000173999999996,0.006664122999999995,0.018817133200000002,0.0245983652,data/benchmark/100_100_1500.csv +bin/csv-split -l 100 data/benchmark/100_7600_100.csv -n ./temp/split,0.10900358157300008,0.0011738636042714235,0.10828899820000001,0.07575731200000003,0.033047884000000076,0.1074039722,0.11780057120000001,data/benchmark/100_7600_100.csv +bin/csv-split -l 100 data/benchmark/8000_100_100.csv -n ./temp/split,0.24986265381700035,0.02145142821011789,0.25122075070000005,0.11778692599999986,0.07527222,0.1886806172,0.36270992020000004,data/benchmark/8000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7400.csv -n ./temp/split,0.09046401155599992,0.0011892140496485677,0.08986285620000001,0.06069396899999995,0.029586789000000027,0.08928610320000001,0.0992681562,data/benchmark/100_100_7400.csv +bin/csv-split -l 100 data/benchmark/100_6400_100.csv -n ./temp/split,0.09200273826800004,0.001118176523669598,0.09148980970000001,0.06384757500000006,0.02796767500000002,0.09074139120000001,0.0962834342,data/benchmark/100_6400_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1700.csv -n ./temp/split,0.022289275346000014,0.0008065323953943088,0.0221690387,0.014790163999999984,0.007426113999999992,0.021213157200000003,0.027043272200000003,data/benchmark/100_100_1700.csv +bin/csv-split -l 100 data/benchmark/100_7700_100.csv -n ./temp/split,0.11098392620500006,0.0011764081050797339,0.11033747020000001,0.07739755400000006,0.03338364699999999,0.1098706862,0.11620341120000001,data/benchmark/100_7700_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1000.csv -n ./temp/split,0.013540770567000015,0.0007329677264180122,0.013113173200000001,0.008905304999999983,0.004586305000000003,0.0127731892,0.017447497200000002,data/benchmark/100_100_1000.csv +bin/csv-split -l 100 data/benchmark/9500_100_100.csv -n ./temp/split,0.2984516575480003,0.02283964668352094,0.30329208220000003,0.13982735799999998,0.08955531899999992,0.22412803020000002,0.41992416520000003,data/benchmark/9500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4700.csv -n ./temp/split,0.05860813368200011,0.0009610652869581021,0.05810805220000001,0.038310105999999955,0.020165601000000033,0.05770973720000001,0.0677335492,data/benchmark/100_100_4700.csv +bin/csv-split -l 100 data/benchmark/6900_100_100.csv -n ./temp/split,0.21655281582000013,0.01681166628902363,0.2207129122,0.1016444499999998,0.06541939600000009,0.16443863520000002,0.3184832222,data/benchmark/6900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6000.csv -n ./temp/split,0.07424384192399998,0.0010061451219847647,0.0737183397,0.04910914800000009,0.024982586999999976,0.0734158602,0.0831408372,data/benchmark/100_100_6000.csv +bin/csv-split -l 100 data/benchmark/100_100_2800.csv -n ./temp/split,0.035340754729999965,0.0005622317552792175,0.0350810037,0.023139357000000017,0.012115892999999987,0.034813242200000004,0.041920642200000004,data/benchmark/100_100_2800.csv +bin/csv-split -l 100 data/benchmark/100_100_9800.csv -n ./temp/split,0.1206386204740001,0.0013613595899043531,0.11987581620000001,0.08011581699999995,0.04030356499999996,0.1195401572,0.1364317672,data/benchmark/100_100_9800.csv +bin/csv-split -l 100 data/benchmark/100_8200_100.csv -n ./temp/split,0.118737916059,0.0013309668478397386,0.1180952527,0.08221997699999994,0.036295541000000014,0.11743783020000001,0.1261327752,data/benchmark/100_8200_100.csv +bin/csv-split -l 100 data/benchmark/100_9700_100.csv -n ./temp/split,0.1410141355070001,0.0013448360520465197,0.1404777182,0.097807768,0.04294266300000003,0.1395515352,0.1483819862,data/benchmark/100_9700_100.csv +bin/csv-split -l 100 data/benchmark/5800_100_100.csv -n ./temp/split,0.1807254252159998,0.019127645697699844,0.17638833869999998,0.08503644700000007,0.05401816300000003,0.13687979420000002,0.40061776720000003,data/benchmark/5800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6200.csv -n ./temp/split,0.07630843005900007,0.0011090878313251363,0.0757389027,0.050930035000000026,0.02520647099999997,0.0754631422,0.0849037762,data/benchmark/100_100_6200.csv +bin/csv-split -l 100 data/benchmark/100_5500_100.csv -n ./temp/split,0.07938408743099996,0.001141139773062014,0.07869900020000001,0.055542771000000046,0.023679178999999998,0.0783958022,0.0864254262,data/benchmark/100_5500_100.csv +bin/csv-split -l 100 data/benchmark/100_3600_100.csv -n ./temp/split,0.052461025208000014,0.0009271153016218013,0.052381279700000005,0.03661046699999997,0.015725645000000003,0.05154325320000001,0.05863012220000001,data/benchmark/100_3600_100.csv +bin/csv-split -l 100 data/benchmark/1800_100_100.csv -n ./temp/split,0.050289635087999975,0.013066126180146147,0.04327112570000001,0.02651248399999999,0.016707593999999996,0.042182124200000004,0.0944668572,data/benchmark/1800_100_100.csv +bin/csv-split -l 100 data/benchmark/1700_100_100.csv -n ./temp/split,0.04810441187900006,0.013942145837969093,0.04050732870000001,0.02492589300000003,0.015703909999999977,0.03972170120000001,0.0992693482,data/benchmark/1700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_700.csv -n ./temp/split,0.009792314144999995,0.0005939807839164902,0.009944032700000001,0.00650865900000001,0.003248188199999998,0.0089789362,0.0136799382,data/benchmark/100_100_700.csv +bin/csv-split -l 100 data/benchmark/100_4600_100.csv -n ./temp/split,0.06671342665899999,0.000989385193833825,0.0661299997,0.046412752999999925,0.02015636699999995,0.0659342502,0.0742505762,data/benchmark/100_4600_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9200.csv -n ./temp/split,0.11216540680099996,0.0013553359321077053,0.1115062677,0.07455614599999999,0.03741234499999999,0.1108630342,0.1163837682,data/benchmark/100_100_9200.csv +bin/csv-split -l 100 data/benchmark/8900_100_100.csv -n ./temp/split,0.27903798973500016,0.02318163491740463,0.2802355147000001,0.130670769,0.08244740500000004,0.2089676142,0.38305323020000004,data/benchmark/8900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_8500_100.csv -n ./temp/split,0.12232564962000002,0.0013191075755926678,0.1216779922,0.08546726500000007,0.036623070999999986,0.12090664420000001,0.1293205362,data/benchmark/100_8500_100.csv +bin/csv-split -l 100 data/benchmark/100_100_8900.csv -n ./temp/split,0.10891529126700006,0.0014432400541912898,0.1079793372,0.07309681800000012,0.03561200000000002,0.1075112142,0.1156456622,data/benchmark/100_100_8900.csv +bin/csv-split -l 100 data/benchmark/100_1400_100.csv -n ./temp/split,0.021488605578000045,0.0007301152735668859,0.021345942700000002,0.014703050999999993,0.006715783700000011,0.0207069992,0.0253299222,data/benchmark/100_1400_100.csv +bin/csv-split -l 100 data/benchmark/4800_100_100.csv -n ./temp/split,0.14711652950700005,0.026916246931867224,0.14920691270000003,0.07085429499999993,0.044632064999999915,0.1128844552,0.23034345220000002,data/benchmark/4800_100_100.csv +bin/csv-split -l 100 data/benchmark/6300_100_100.csv -n ./temp/split,0.19706306894899991,0.020605472452481257,0.1897879237,0.092385014,0.058674505000000064,0.1476696892,0.3135800852,data/benchmark/6300_100_100.csv +bin/csv-split -l 100 data/benchmark/500_100_100.csv -n ./temp/split,0.011714564168999997,0.0005668764754640916,0.011403233700000001,0.007254693999999998,0.004406203100000005,0.0111657332,0.0171179552,data/benchmark/500_100_100.csv +bin/csv-split -l 100 data/benchmark/9100_100_100.csv -n ./temp/split,0.286997572876,0.026684585250215564,0.28526781320000005,0.13356386400000014,0.08412507799999994,0.2131786832,0.5814719722,data/benchmark/9100_100_100.csv +bin/csv-split -l 100 data/benchmark/3100_100_100.csv -n ./temp/split,0.09229436920600007,0.014959137548855058,0.09425990819999999,0.04573116800000007,0.029263670000000023,0.0729645022,0.1838282012,data/benchmark/3100_100_100.csv +bin/csv-split -l 100 data/benchmark/5700_100_100.csv -n ./temp/split,0.17820380265399996,0.018948255752624724,0.17373479270000003,0.08354647099999997,0.053052372999999986,0.1337445432,0.35862489620000004,data/benchmark/5700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_8600_100.csv -n ./temp/split,0.12303750147499998,0.0010346486450058302,0.1225571452,0.08617448900000016,0.03663708300000002,0.1216608532,0.1268769952,data/benchmark/100_8600_100.csv +bin/csv-split -l 100 data/benchmark/100_7900_100.csv -n ./temp/split,0.11317071575100011,0.0013162735108393465,0.1124215182,0.07960446600000007,0.033348322999999944,0.11180554520000001,0.1206536212,data/benchmark/100_7900_100.csv +bin/csv-split -l 100 data/benchmark/9900_100_100.csv -n ./temp/split,0.31284554019800065,0.026315806314502983,0.3091911117,0.1449323030000001,0.0917858139999999,0.2318648772,0.42369140820000006,data/benchmark/9900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_8300_100.csv -n ./temp/split,0.11918885129100004,0.0013637721297075705,0.1185569612,0.08355981999999998,0.035403665,0.11781391120000001,0.1267594692,data/benchmark/100_8300_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6800.csv -n ./temp/split,0.08308569956599991,0.0013439829650746292,0.0822015807,0.05557346499999998,0.027340779999999995,0.0817635092,0.0897060032,data/benchmark/100_100_6800.csv +bin/csv-split -l 100 data/benchmark/2200_100_100.csv -n ./temp/split,0.06468274030399986,0.013857939510977227,0.0549047042,0.032532069999999975,0.020816468000000025,0.051977464200000004,0.1883356132,data/benchmark/2200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_7500_100.csv -n ./temp/split,0.10785941881399998,0.0013988248759285854,0.1070439842,0.07488301100000004,0.03276723799999999,0.10670727020000001,0.11526619020000001,data/benchmark/100_7500_100.csv +bin/csv-split -l 100 data/benchmark/7500_100_100.csv -n ./temp/split,0.2350611039940002,0.023767404282825106,0.24218670320000002,0.11050331400000006,0.06930211399999996,0.1761136572,0.36392558520000007,data/benchmark/7500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_9300_100.csv -n ./temp/split,0.1332011399839999,0.0014459332740725727,0.1324049802,0.09324925700000009,0.03968934999999999,0.13204768120000002,0.1406073072,data/benchmark/100_9300_100.csv +bin/csv-split -l 100 data/benchmark/100_300_100.csv -n ./temp/split,0.004704711481000007,0.00034256860659883775,0.0045976632,0.0031849069600000056,0.0015575668000000014,0.0045374952,0.0074515872,data/benchmark/100_300_100.csv +bin/csv-split -l 100 data/benchmark/100_4200_100.csv -n ./temp/split,0.060934052809000036,0.000892859589258272,0.06039486720000001,0.04217221799999999,0.0186333,0.06012052620000001,0.0670548562,data/benchmark/100_4200_100.csv +bin/csv-split -l 100 data/benchmark/8400_100_100.csv -n ./temp/split,0.2638314760960001,0.023836458528511885,0.26394148920000005,0.12314971700000002,0.07782478199999994,0.1969367142,0.48826164220000007,data/benchmark/8400_100_100.csv +bin/csv-split -l 100 data/benchmark/3600_100_100.csv -n ./temp/split,0.10822624823999998,0.012288507297458914,0.1086369172,0.05320878400000004,0.033662279,0.0847060662,0.1715981152,data/benchmark/3600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9600.csv -n ./temp/split,0.11692690641099993,0.0016039779813820808,0.1158935687,0.07855308300000001,0.03814427500000007,0.1155504442,0.1265752382,data/benchmark/100_100_9600.csv +bin/csv-split -l 100 data/benchmark/8300_100_100.csv -n ./temp/split,0.2639127428440004,0.030672556890935985,0.2633473327,0.12228051199999994,0.07695013499999998,0.1945886412,0.42695533520000006,data/benchmark/8300_100_100.csv +bin/csv-split -l 100 data/benchmark/5600_100_100.csv -n ./temp/split,0.17388527525300015,0.014698264775602267,0.1712385157,0.08217821800000007,0.052008276000000055,0.1317864092,0.2335976442,data/benchmark/5600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_10000_100.csv -n ./temp/split,0.14428219320699986,0.0015030010978012657,0.14358996870000001,0.09985704200000008,0.04415040100000005,0.1426956262,0.1537679492,data/benchmark/100_10000_100.csv +bin/csv-split -l 100 data/benchmark/100_7400_100.csv -n ./temp/split,0.10684121976100001,0.0014525351598077604,0.1059752402,0.07474791800000007,0.031873977000000005,0.1056677152,0.1160507122,data/benchmark/100_7400_100.csv +bin/csv-split -l 100 data/benchmark/4200_100_100.csv -n ./temp/split,0.12936047473800016,0.017635660700748734,0.12797297270000002,0.06201890200000006,0.03943537900000003,0.09904466220000001,0.2696401332,data/benchmark/4200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5600.csv -n ./temp/split,0.06936783677300003,0.0009561249316033687,0.06897885270000001,0.04588234700000005,0.02333380599999998,0.0682084722,0.0747258532,data/benchmark/100_100_5600.csv +bin/csv-split -l 100 data/benchmark/100_6700_100.csv -n ./temp/split,0.09757942812,0.0014918556932251707,0.0968010077,0.06760735600000004,0.02976351599999996,0.0961789302,0.1068617812,data/benchmark/100_6700_100.csv +bin/csv-split -l 100 data/benchmark/100_100_4000.csv -n ./temp/split,0.05020474684000004,0.0006609748732567748,0.050305960200000006,0.03314306399999999,0.016943255000000008,0.049346788200000005,0.05385711320000001,data/benchmark/100_100_4000.csv +bin/csv-split -l 100 data/benchmark/100_1000_100.csv -n ./temp/split,0.015158384964000004,0.00044960532738318556,0.0150307097,0.010337204000000006,0.004774890400000003,0.014876390199999999,0.0200713132,data/benchmark/100_1000_100.csv +bin/csv-split -l 100 data/benchmark/8700_100_100.csv -n ./temp/split,0.2750427640379999,0.026931044556343656,0.2726666647,0.12804426099999994,0.08179537899999986,0.2056222872,0.45732361520000003,data/benchmark/8700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9500.csv -n ./temp/split,0.11674267158099996,0.0015383578382204511,0.1159179457,0.07675114799999994,0.039774446000000005,0.1155575622,0.12545718520000002,data/benchmark/100_100_9500.csv +bin/csv-split -l 100 data/benchmark/4700_100_100.csv -n ./temp/split,0.14440769163500014,0.015280284407644026,0.1431630817,0.06921728299999992,0.04423127599999997,0.1113243142,0.22312475920000002,data/benchmark/4700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1800.csv -n ./temp/split,0.023377563361999986,0.0007840949063796537,0.023075960200000002,0.015308604999999972,0.008001935000000002,0.0225287272,0.026999208200000003,data/benchmark/100_100_1800.csv +bin/csv-split -l 100 data/benchmark/100_1600_100.csv -n ./temp/split,0.024231948907000016,0.0007737846778361409,0.0239488937,0.016524425000000002,0.007638529000000004,0.0234213992,0.030528573200000002,data/benchmark/100_1600_100.csv +bin/csv-split -l 100 data/benchmark/9300_100_100.csv -n ./temp/split,0.2942724832880006,0.025129132041963785,0.29579295820000007,0.1367240460000001,0.08743718300000007,0.2198031892,0.40249062020000004,data/benchmark/9300_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3300.csv -n ./temp/split,0.041444199527,0.0008299103409411436,0.0410988357,0.027232441999999975,0.014113867999999998,0.0407132482,0.04952456920000001,data/benchmark/100_100_3300.csv +bin/csv-split -l 100 data/benchmark/100_100_3000.csv -n ./temp/split,0.037221143171999975,0.0007227936123151996,0.036839176700000004,0.02476503699999999,0.012355868000000006,0.036599006200000006,0.04196914720000001,data/benchmark/100_100_3000.csv +bin/csv-split -l 100 data/benchmark/100_2700_100.csv -n ./temp/split,0.039391424556999996,0.0004924388242401976,0.039486601700000006,0.02728798899999996,0.012009987999999996,0.03876594120000001,0.04506744420000001,data/benchmark/100_2700_100.csv +bin/csv-split -l 100 data/benchmark/6200_100_100.csv -n ./temp/split,0.19372350156400023,0.01778540640660544,0.1972175492,0.09145761299999985,0.0577773019999999,0.1463401232,0.27825553020000005,data/benchmark/6200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_600.csv -n ./temp/split,0.008207220888999986,0.0004893364073611214,0.0080330867,0.005435482999999997,0.002742786700000002,0.0078840902,0.0120747512,data/benchmark/100_100_600.csv +bin/csv-split -l 100 data/benchmark/8600_100_100.csv -n ./temp/split,0.2730396363029997,0.028837983529239122,0.2705396017,0.12662434700000014,0.07969673700000005,0.20197666520000002,0.5502264632,data/benchmark/8600_100_100.csv +bin/csv-split -l 100 data/benchmark/100_9900_100.csv -n ./temp/split,0.14239405003700004,0.0015567035429984877,0.1416637287,0.09944436600000005,0.042677834999999935,0.1407445842,0.15253838120000002,data/benchmark/100_9900_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3600.csv -n ./temp/split,0.04480602509099995,0.0007423016026017698,0.0444675967,0.029744651000000018,0.014955834999999995,0.0441708062,0.05124601520000001,data/benchmark/100_100_3600.csv +bin/csv-split -l 100 data/benchmark/6700_100_100.csv -n ./temp/split,0.2115237740729997,0.020773765940280912,0.2138820407,0.0982941049999998,0.06267989599999998,0.1578883762,0.3322156512,data/benchmark/6700_100_100.csv +bin/csv-split -l 100 data/benchmark/4100_100_100.csv -n ./temp/split,0.12604818366000006,0.017827148299655586,0.12595098370000002,0.059920435000000036,0.038662681999999976,0.0964499352,0.2358811882,data/benchmark/4100_100_100.csv +bin/csv-split -l 100 data/benchmark/700_100_100.csv -n ./temp/split,0.016785979624999985,0.0008813964047242846,0.0167220352,0.010191854999999994,0.006489831000000001,0.0160259162,0.03295969520000001,data/benchmark/700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9000.csv -n ./temp/split,0.11030359261599992,0.0013918409992361826,0.1094899312,0.07340006999999987,0.036686432000000005,0.10873986520000001,0.11474290720000001,data/benchmark/100_100_9000.csv +bin/csv-split -l 100 data/benchmark/100_100_900.csv -n ./temp/split,0.012444631431999992,0.0006812824085659544,0.012124489200000001,0.008106480999999994,0.0042897747999999965,0.0117456272,0.017363443200000002,data/benchmark/100_100_900.csv +bin/csv-split -l 100 data/benchmark/100_100_5200.csv -n ./temp/split,0.064519136094,0.001229964101316091,0.0646573202,0.04299532400000004,0.02136281499999999,0.0632323742,0.0734426832,data/benchmark/100_100_5200.csv +bin/csv-split -l 100 data/benchmark/100_100_9400.csv -n ./temp/split,0.11496467912500011,0.00185065102102959,0.1149591827,0.07682664700000003,0.037905246999999934,0.1126293232,0.1245422092,data/benchmark/100_100_9400.csv +bin/csv-split -l 100 data/benchmark/100_100_2300.csv -n ./temp/split,0.029115339165999992,0.0006988710356605095,0.029144870700000002,0.019216376999999982,0.009810435,0.0283881172,0.035662348200000006,data/benchmark/100_100_2300.csv +bin/csv-split -l 100 data/benchmark/5200_100_100.csv -n ./temp/split,0.1615955156439999,0.016118893174332218,0.15992647670000001,0.07627660200000001,0.047820069999999985,0.1221998472,0.2897479592,data/benchmark/5200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_1200_100.csv -n ./temp/split,0.018063055103000027,0.0006490937926284602,0.0179214122,0.012366458000000006,0.005646431699999995,0.017594710200000002,0.0239304252,data/benchmark/100_1200_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5000.csv -n ./temp/split,0.06117799943399988,0.0008150537798701066,0.06072971820000001,0.041049425999999986,0.019994647000000004,0.060572011200000005,0.0674693962,data/benchmark/100_100_5000.csv +bin/csv-split -l 100 data/benchmark/200_100_100.csv -n ./temp/split,0.004207799008999998,0.00035862231722912275,0.0040698277,0.002610338045000003,0.0016129266999999965,0.003987220200000001,0.006752612200000001,data/benchmark/200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5900.csv -n ./temp/split,0.07178609766100004,0.0010926169036477315,0.0712822682,0.04799093900000001,0.02364233599999997,0.0708445632,0.0803413162,data/benchmark/100_100_5900.csv +bin/csv-split -l 100 data/benchmark/100_100_6700.csv -n ./temp/split,0.08166651332599997,0.0011726836264763219,0.0810054102,0.0546671599999999,0.026828694000000004,0.0804830732,0.0866847742,data/benchmark/100_100_6700.csv +bin/csv-split -l 100 data/benchmark/100_8400_100.csv -n ./temp/split,0.12024790750399986,0.0015566663619720337,0.1193130922,0.08360770300000017,0.03640268800000003,0.1189885752,0.1296951622,data/benchmark/100_8400_100.csv +bin/csv-split -l 100 data/benchmark/100_9500_100.csv -n ./temp/split,0.13621055985000002,0.0013668123696648669,0.1355320462,0.09549319999999992,0.040465842999999974,0.1348844952,0.1448939242,data/benchmark/100_9500_100.csv +bin/csv-split -l 100 data/benchmark/4600_100_100.csv -n ./temp/split,0.14151143864000015,0.015148244332915981,0.1380213452,0.067695912,0.04335648800000003,0.1087256692,0.22179862220000002,data/benchmark/4600_100_100.csv +bin/csv-split -l 100 data/benchmark/8100_100_100.csv -n ./temp/split,0.2564172131389998,0.024731431111995956,0.25491165120000003,0.1195095360000001,0.07674414499999996,0.1918899162,0.3951195552,data/benchmark/8100_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1600.csv -n ./temp/split,0.020860668164999995,0.0007594869838575717,0.020512808700000003,0.013657176000000035,0.0071394469999999976,0.0201183602,0.027274902200000003,data/benchmark/100_100_1600.csv +bin/csv-split -l 100 data/benchmark/100_3000_100.csv -n ./temp/split,0.04367347427999999,0.0010408330929394867,0.043130104700000005,0.030522457999999992,0.013031024000000006,0.042929117200000005,0.05259698420000001,data/benchmark/100_3000_100.csv +bin/csv-split -l 100 data/benchmark/300_100_100.csv -n ./temp/split,0.006850433934999996,0.0004797616529763957,0.0067067697,0.004280603000000008,0.002546042199999998,0.0063643212,0.0094136562,data/benchmark/300_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9700.csv -n ./temp/split,0.11929856932299993,0.0013334420204812623,0.1184651977,0.07932427599999997,0.03975126199999993,0.1176463022,0.12242576420000001,data/benchmark/100_100_9700.csv +bin/csv-split -l 100 data/benchmark/100_100_2500.csv -n ./temp/split,0.03154566575499996,0.0007262485433671964,0.03126256470000001,0.020941539999999967,0.010510262999999997,0.030908240200000003,0.0358213922,data/benchmark/100_100_2500.csv +bin/csv-split -l 100 data/benchmark/4000_100_100.csv -n ./temp/split,0.12289423550199982,0.01511607047269697,0.1200165987,0.05887648200000002,0.037801735999999996,0.0951349752,0.27038140620000006,data/benchmark/4000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_1700_100.csv -n ./temp/split,0.025559918124999942,0.0006795486107969506,0.025455379700000003,0.01764306800000002,0.007840668,0.0248462892,0.031213409200000004,data/benchmark/100_1700_100.csv +bin/csv-split -l 100 data/benchmark/6500_100_100.csv -n ./temp/split,0.2046432307940002,0.01795822449972305,0.2020279627,0.09551220100000009,0.061632565000000014,0.1537566812,0.32011968120000006,data/benchmark/6500_100_100.csv +bin/csv-split -l 100 data/benchmark/1200_100_100.csv -n ./temp/split,0.032632268133,0.010195874847386703,0.028572920700000004,0.017523650999999998,0.011249598999999994,0.0279538632,0.1080155722,data/benchmark/1200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3800.csv -n ./temp/split,0.04733355406700002,0.0009098929070526655,0.046904235200000005,0.03133014300000002,0.01589229600000003,0.04646168020000001,0.05338375420000001,data/benchmark/100_100_3800.csv +bin/csv-split -l 100 data/benchmark/3700_100_100.csv -n ./temp/split,0.11648556142299998,0.012589428477495317,0.1115793607,0.05435448099999996,0.035044349999999974,0.0882835922,0.19237408820000002,data/benchmark/3700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3700.csv -n ./temp/split,0.04612280175800006,0.0007440562355860217,0.0457986207,0.030527682999999996,0.015491791999999997,0.045400662200000004,0.05296447420000001,data/benchmark/100_100_3700.csv +bin/csv-split -l 100 data/benchmark/100_100_7000.csv -n ./temp/split,0.08592015210899993,0.0010952197468453034,0.0852908507,0.05709179299999997,0.02865332000000003,0.0846389712,0.0904486752,data/benchmark/100_100_7000.csv +bin/csv-split -l 100 data/benchmark/100_4000_100.csv -n ./temp/split,0.05834842989000009,0.0007378250361729817,0.058031375200000006,0.04015248200000005,0.01806302599999998,0.05760712920000001,0.0664657772,data/benchmark/100_4000_100.csv +bin/csv-split -l 100 data/benchmark/100_1100_100.csv -n ./temp/split,0.016956233708,0.0007558693677974571,0.0166032422,0.011666879000000012,0.005235471000000005,0.0162641032,0.021974839200000002,data/benchmark/100_1100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6500.csv -n ./temp/split,0.08012866925700005,0.0010546534776940226,0.0794866937,0.05312043500000001,0.02685205000000001,0.0792124712,0.0878289632,data/benchmark/100_100_6500.csv +bin/csv-split -l 100 data/benchmark/100_8100_100.csv -n ./temp/split,0.11715807192199991,0.0013355635226948797,0.1166471237,0.08138103699999988,0.03554586799999999,0.1157041442,0.1268572272,data/benchmark/100_8100_100.csv +bin/csv-split -l 100 data/benchmark/3000_100_100.csv -n ./temp/split,0.09060375710500004,0.014043566195317245,0.09213161219999999,0.04453345799999996,0.028209717000000026,0.0707773982,0.1673067882,data/benchmark/3000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5300.csv -n ./temp/split,0.06525930881800002,0.000779406116712097,0.0649550292,0.0433682709999999,0.021757676000000024,0.0643955742,0.0697809692,data/benchmark/100_100_5300.csv +bin/csv-split -l 100 data/benchmark/1400_100_100.csv -n ./temp/split,0.037667284556999955,0.008540778313343607,0.0335783392,0.020596957000000037,0.01312023999999998,0.03284806020000001,0.0827250972,data/benchmark/1400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_5700.csv -n ./temp/split,0.069530229721,0.0011055804280235906,0.0688951112,0.04651501499999996,0.02286782700000002,0.0685241922,0.0747013612,data/benchmark/100_100_5700.csv +bin/csv-split -l 100 data/benchmark/100_4300_100.csv -n ./temp/split,0.062364867448000086,0.0008293550737445527,0.0619448297,0.043372983000000025,0.01886096399999998,0.061530496200000014,0.0680216002,data/benchmark/100_4300_100.csv +bin/csv-split -l 100 data/benchmark/100_8900_100.csv -n ./temp/split,0.12825836241799995,0.001247822947191139,0.1275846612,0.08944963399999997,0.038580486000000025,0.1268533522,0.1334766342,data/benchmark/100_8900_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3100.csv -n ./temp/split,0.03862902768200005,0.0005764859162553569,0.038843843200000006,0.025493210999999974,0.013048331000000005,0.037903192200000005,0.040664440200000006,data/benchmark/100_100_3100.csv +bin/csv-split -l 100 data/benchmark/100_100_8700.csv -n ./temp/split,0.10631054574700008,0.0012732215535096153,0.1056425277,0.07110984500000006,0.03499339400000002,0.10500760020000001,0.11363103520000001,data/benchmark/100_100_8700.csv +bin/csv-split -l 100 data/benchmark/100_4800_100.csv -n ./temp/split,0.06929831529999995,0.0007819096394221077,0.0688813992,0.04829081200000007,0.020859479000000018,0.0685268192,0.0734171302,data/benchmark/100_4800_100.csv +bin/csv-split -l 100 data/benchmark/5500_100_100.csv -n ./temp/split,0.17264797816099994,0.017702023819798924,0.17129661870000001,0.08118119800000001,0.0519382800000001,0.1299435962,0.27939363520000005,data/benchmark/5500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_7800_100.csv -n ./temp/split,0.11239964612399983,0.0011797833066542764,0.1116864712,0.07815495599999994,0.034036525000000005,0.1112580382,0.1193160202,data/benchmark/100_7800_100.csv +bin/csv-split -l 100 data/benchmark/6400_100_100.csv -n ./temp/split,0.20222694476699973,0.019100304396143332,0.1975565642,0.09411363899999996,0.060811336000000014,0.1512992722,0.33867807020000007,data/benchmark/6400_100_100.csv +bin/csv-split -l 100 data/benchmark/100_6900_100.csv -n ./temp/split,0.09992437955100003,0.0011918022276336529,0.0993452367,0.06945303100000005,0.030268822999999993,0.09866916220000001,0.1061860012,data/benchmark/100_6900_100.csv +bin/csv-split -l 100 data/benchmark/100_100_9300.csv -n ./temp/split,0.11414531287199987,0.0014776701850242001,0.1133236937,0.07578688099999999,0.038140977999999964,0.1125195432,0.1211591962,data/benchmark/100_100_9300.csv +bin/csv-split -l 100 data/benchmark/100_100_1200.csv -n ./temp/split,0.016175912132000005,0.0007746239496374428,0.0157487477,0.010604893999999998,0.005518789999999994,0.015424287200000001,0.021944854200000002,data/benchmark/100_100_1200.csv +bin/csv-split -l 100 data/benchmark/7900_100_100.csv -n ./temp/split,0.2519569573210001,0.027435936367518184,0.25051239320000007,0.11640252599999996,0.07448151200000001,0.18720221720000002,0.4324027442000001,data/benchmark/7900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_6500_100.csv -n ./temp/split,0.0934065836099999,0.0009929722012816575,0.0929773777,0.06525023200000007,0.027971955999999996,0.0923744412,0.0987832362,data/benchmark/100_6500_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6400.csv -n ./temp/split,0.07843365096699992,0.0010025162997227173,0.07800745519999999,0.05260101199999994,0.025674136000000004,0.0774847412,0.08753362320000001,data/benchmark/100_100_6400.csv +bin/csv-split -l 100 data/benchmark/5000_100_100.csv -n ./temp/split,0.1549852251760002,0.016286678385700994,0.1534749272,0.0735210159999999,0.046308489000000015,0.1178262912,0.2368879842,data/benchmark/5000_100_100.csv +bin/csv-split -l 100 data/benchmark/4900_100_100.csv -n ./temp/split,0.15453647982299998,0.01761264314774335,0.15125146420000002,0.0720928640000001,0.045424710999999944,0.1152301782,0.3259712732,data/benchmark/4900_100_100.csv +bin/csv-split -l 100 data/benchmark/100_3900_100.csv -n ./temp/split,0.056792973645,0.0009748573566078763,0.05700393220000001,0.039700176999999975,0.016962437999999986,0.055836212200000006,0.0657676742,data/benchmark/100_3900_100.csv +bin/csv-split -l 100 data/benchmark/2800_100_100.csv -n ./temp/split,0.08425943698100004,0.016883617338108902,0.0888166682,0.041149808999999996,0.026108872000000026,0.0659689242,0.1483507682,data/benchmark/2800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_900_100.csv -n ./temp/split,0.013941524143000015,0.0005686178245267568,0.0136578597,0.009679097999999994,0.004220507599999996,0.0133216062,0.0172323742,data/benchmark/100_900_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6600.csv -n ./temp/split,0.0801486069390002,0.0011656318627163598,0.0794211272,0.053736632000000055,0.026251035999999995,0.0788888842,0.0869443862,data/benchmark/100_100_6600.csv +bin/csv-split -l 100 data/benchmark/3500_100_100.csv -n ./temp/split,0.10795017201799995,0.01694728986783356,0.1136317097,0.05128132900000008,0.032832453999999976,0.0826669792,0.1785604802,data/benchmark/3500_100_100.csv +bin/csv-split -l 100 data/benchmark/400_100_100.csv -n ./temp/split,0.009998111859999994,0.003417490251042996,0.0095701292,0.005861484000000005,0.0036163265000000023,0.008781456200000001,0.05502037120000001,data/benchmark/400_100_100.csv +bin/csv-split -l 100 data/benchmark/9000_100_100.csv -n ./temp/split,0.2901449831279998,0.03243512946375374,0.28759477270000006,0.132845338,0.08438014900000003,0.2117848712,0.5506836602,data/benchmark/9000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_6900.csv -n ./temp/split,0.08412993009800002,0.001311046581055567,0.0833947877,0.05618574900000001,0.027772126000000015,0.0827622712,0.0922101442,data/benchmark/100_100_6900.csv +bin/csv-split -l 100 data/benchmark/100_100_1400.csv -n ./temp/split,0.018510828952000007,0.0007560141270449238,0.0182197267,0.012185326999999963,0.006269034700000005,0.0176546962,0.0238448302,data/benchmark/100_100_1400.csv +bin/csv-split -l 100 data/benchmark/2400_100_100.csv -n ./temp/split,0.07241947231900003,0.017276877481506487,0.0769209377,0.035265427999999974,0.022734023999999985,0.05637032620000001,0.23044496120000002,data/benchmark/2400_100_100.csv +bin/csv-split -l 100 data/benchmark/6800_100_100.csv -n ./temp/split,0.2193715074280001,0.032457088136369425,0.21487915820000003,0.099929382,0.06354707399999994,0.1600699512,0.48729153320000007,data/benchmark/6800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_4900_100.csv -n ./temp/split,0.07109979222099999,0.000951599713941748,0.0706180537,0.04954750499999997,0.02140088399999998,0.0700935082,0.0775781682,data/benchmark/100_4900_100.csv +bin/csv-split -l 100 data/benchmark/1100_100_100.csv -n ./temp/split,0.02791996783499998,0.003570025018969353,0.0272703632,0.016421848,0.010296463000000007,0.025535254200000003,0.0633112312,data/benchmark/1100_100_100.csv +bin/csv-split -l 100 data/benchmark/1900_100_100.csv -n ./temp/split,0.056794042673000034,0.018286961399240808,0.04567547920000001,0.027713021999999983,0.017769986999999998,0.0445346542,0.14328625520000002,data/benchmark/1900_100_100.csv +bin/csv-split -l 100 data/benchmark/2500_100_100.csv -n ./temp/split,0.07543155458299995,0.021233868958779614,0.060758770200000006,0.03654308599999996,0.02347173999999998,0.058763425200000004,0.2195086312,data/benchmark/2500_100_100.csv +bin/csv-split -l 100 data/benchmark/100_9200_100.csv -n ./temp/split,0.132309863864,0.0015812345036822855,0.1317644732,0.09220424699999988,0.03985646899999997,0.1304924972,0.1381234722,data/benchmark/100_9200_100.csv +bin/csv-split -l 100 data/benchmark/100_9800_100.csv -n ./temp/split,0.140395218695,0.0013153079646823472,0.13970237470000002,0.09832874800000001,0.04181426400000004,0.1391077082,0.1460846032,data/benchmark/100_9800_100.csv +bin/csv-split -l 100 data/benchmark/100_100_3200.csv -n ./temp/split,0.03955641528900001,0.0006616008825179678,0.03918126370000001,0.02636418800000001,0.013096879000000014,0.0389950042,0.045575767200000006,data/benchmark/100_100_3200.csv +bin/csv-split -l 100 data/benchmark/100_400_100.csv -n ./temp/split,0.006438608357000003,0.0005540986721265399,0.0062141607000000005,0.004408565000000007,0.0020346835999999996,0.0059896381999999995,0.0096288962,data/benchmark/100_400_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2600.csv -n ./temp/split,0.03251340294300006,0.0008395540503374027,0.0325308762,0.021796176999999976,0.010624750999999974,0.031816055200000005,0.040990704200000005,data/benchmark/100_100_2600.csv +bin/csv-split -l 100 data/benchmark/100_6000_100.csv -n ./temp/split,0.086064201504,0.000984223994017818,0.08558489920000001,0.05966772500000004,0.026224883000000025,0.0852503762,0.0927345742,data/benchmark/100_6000_100.csv +bin/csv-split -l 100 data/benchmark/100_100_2200.csv -n ./temp/split,0.027752477384000024,0.0008177244129018508,0.0276164442,0.018478759000000004,0.009193429999999995,0.0270708832,0.035429619200000005,data/benchmark/100_100_2200.csv +bin/csv-split -l 100 data/benchmark/100_2100_100.csv -n ./temp/split,0.030987548181999988,0.0009875955826750096,0.030486467700000002,0.021499030000000006,0.009392300999999994,0.0303868772,0.03942131420000001,data/benchmark/100_2100_100.csv +bin/csv-split -l 100 data/benchmark/8800_100_100.csv -n ./temp/split,0.285616913173,0.03438855280363721,0.28407747820000007,0.12980110500000006,0.08336419099999988,0.20713538920000002,0.6377714972,data/benchmark/8800_100_100.csv +bin/csv-split -l 100 data/benchmark/100_6100_100.csv -n ./temp/split,0.08816487602799994,0.0012017661725096476,0.0874589652,0.06158129700000003,0.026406362999999988,0.08712334320000001,0.0977143692,data/benchmark/100_6100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_7300.csv -n ./temp/split,0.08967004023600005,0.0014282927212840304,0.0887886852,0.060003194000000024,0.02948084800000001,0.0884091592,0.0990407142,data/benchmark/100_100_7300.csv +bin/csv-split -l 100 data/benchmark/2700_100_100.csv -n ./temp/split,0.08215477820300003,0.013840587646489202,0.0842800222,0.03971219300000001,0.025811959,0.0641171712,0.1984462102,data/benchmark/2700_100_100.csv +bin/csv-split -l 100 data/benchmark/100_4400_100.csv -n ./temp/split,0.06420803047200005,0.0008649008378088655,0.0637712242,0.044188582000000004,0.019880967000000017,0.0635412542,0.0731036162,data/benchmark/100_4400_100.csv +bin/csv-split -l 100 data/benchmark/100_100_8300.csv -n ./temp/split,0.1028409825149999,0.0011899413734591242,0.1022592502,0.06813175900000003,0.03451919799999999,0.1016092022,0.1079379532,data/benchmark/100_100_8300.csv +bin/csv-split -l 100 data/benchmark/6000_100_100.csv -n ./temp/split,0.19762826085300012,0.024832327837356356,0.1903042572,0.088303561,0.05685600199999991,0.1419801352,0.41527156120000003,data/benchmark/6000_100_100.csv +bin/csv-split -l 100 data/benchmark/100_6300_100.csv -n ./temp/split,0.09177104456399994,0.0011006426208014614,0.09121639370000001,0.06351565799999996,0.028059377,0.09076343020000001,0.0989997902,data/benchmark/100_6300_100.csv +bin/csv-split -l 100 data/benchmark/100_1300_100.csv -n ./temp/split,0.02010740070000002,0.0007605865273557117,0.0198319342,0.013778450999999997,0.006268363000000001,0.0193092962,0.0248631662,data/benchmark/100_1300_100.csv +bin/csv-split -l 100 data/benchmark/8200_100_100.csv -n ./temp/split,0.27586169679699996,0.03782731402174413,0.27345326020000005,0.1208782489999999,0.077836313,0.1947096502,0.5518042692,data/benchmark/8200_100_100.csv +bin/csv-split -l 100 data/benchmark/100_100_1900.csv -n ./temp/split,0.024946891465000013,0.0006936754381506672,0.0247815132,0.016289211,0.008585313000000006,0.0240360142,0.028826687200000003,data/benchmark/100_100_1900.csv diff --git a/benchmark/v0.0.2-1.md b/benchmark/v0.0.2-1.md new file mode 100644 index 0000000..07c9ce0 --- /dev/null +++ b/benchmark/v0.0.2-1.md @@ -0,0 +1,14 @@ +This benchmark uses + +```python +row_min, row_max, row_step = 100, 10001, 100 +col_min, col_max, col_step = 100, 10001, 100 +chr_min, chr_max, chr_step = 100, 10001, 100 +``` + +and a split length of `1000`. Further, hyperfine was set to use 100 warmup and at least 1000 actual runs. + +Here are the results: +![Benchmark results](v0.0.2-1.png) + +You can see that there are clear linear correlations between the running time and the numbers of lines, columns and characters. You can also see though, that there are some significant statistical outliers, which are mostly present for specific numbers of lines. \ No newline at end of file diff --git a/benchmark/v0.0.2-1.png b/benchmark/v0.0.2-1.png new file mode 100644 index 0000000..cfd3ae2 Binary files /dev/null and b/benchmark/v0.0.2-1.png differ diff --git a/scripts/benchmark_imartingraham.sh b/scripts/benchmark_imartingraham.sh new file mode 100755 index 0000000..18888e9 --- /dev/null +++ b/scripts/benchmark_imartingraham.sh @@ -0,0 +1,23 @@ +#!/bin/sh +DIR=$1 +NUM_LINES=$2 +OUT_LOG=$3 +if [ -z "$3" ]; then + printf "Expected 3 arguments: \n" + exit 1 +fi +dout="./temp" +rm -rf $dout +files=$(find $DIR -type f | paste -sd ',') +make bin/imartingraham +BIN="ruby bin/imartingraham/csv-split.rb" +hyperfine \ + "$BIN -l $NUM_LINES -f {file} -n $dout/split" \ + --export-csv $OUT_LOG \ + -m 3 \ + -i \ + --warmup 3 \ + -L file $files \ + --prepare "mkdir -p $dout" \ + --cleanup "rm -rf $dout" \ + --show-output diff --git a/scripts/benchmark_miltfra.sh b/scripts/benchmark_miltfra.sh new file mode 100755 index 0000000..30dc4b8 --- /dev/null +++ b/scripts/benchmark_miltfra.sh @@ -0,0 +1,22 @@ +#!/bin/sh +DIR=$1 +BIN=$2 +NUM_LINES=$3 +OUT_LOG=$4 +if [ -z "$4" ]; then + printf "Expected 4 arguments: \n" + exit 1 +fi +dout="./temp" +rm -rf $dout +files=$(find $1 -type f | paste -sd ',') +hyperfine \ + "$BIN -l $NUM_LINES {file} -n $dout/split" \ + --export-csv $OUT_LOG \ + -m 1000 \ + -i \ + --warmup 100 \ + -L file $files \ + --prepare "mkdir -p $dout" \ + --cleanup "rm -rf $dout" \ + --show-output \ No newline at end of file diff --git a/scripts/benchmark_xsv.sh b/scripts/benchmark_xsv.sh new file mode 100755 index 0000000..7d6f441 --- /dev/null +++ b/scripts/benchmark_xsv.sh @@ -0,0 +1,22 @@ +#!/bin/sh +DIR=$1 +BIN=$2 +NUM_LINES=$3 +OUT_LOG=$4 +if [ -z "$4" ]; then + printf "Expected 4 arguments: \n" + exit 1 +fi +dout="./temp" +rm -rf $dout +files=$(find $1 -type f | paste -sd ',') +hyperfine \ + "$BIN split -s $NUM_LINES $dout/xsv {file}" \ + --export-csv $OUT_LOG \ + -m 3 \ + -i \ + --warmup 3 \ + -L file $files \ + --prepare "mkdir -p $dout" \ + --cleanup "rm -rf $dout" \ + --show-output \ No newline at end of file diff --git a/scripts/generate_bench_data.py b/scripts/generate_bench_data.py new file mode 100755 index 0000000..9f262b5 --- /dev/null +++ b/scripts/generate_bench_data.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +import sys +import os +import subprocess + + +def get_file_name(rows, columns, chars): + return f"{rows}_{columns}_{chars}.csv" + + +def generate_file(binary_path, rows, columns, chars, output_dir): + return subprocess.run([ + "sh", "-c", + f"{binary_path} {rows} {columns} {chars} > {output_dir}/{get_file_name(rows, columns,chars)}" + ]) + + +if len(sys.argv) != 3: + print("Expected exactly two arguments: ") + sys.exit(1) + +GEN = sys.argv[1] +DIR = sys.argv[2] + +row_min, row_max, row_step = 100, 10001, 100 +col_min, col_max, col_step = 100, 10001, 100 +chr_min, chr_max, chr_step = 100, 10001, 100 + +if not os.path.isdir(DIR): + os.mkdir(DIR) + +for row in range(row_min, row_max, row_step): + generate_file(GEN, row, col_min, chr_min, DIR) +for col in range(col_min, col_max, col_step): + generate_file(GEN, row_min, col, chr_min, DIR) +for char in range(chr_min, chr_max, chr_step): + generate_file(GEN, row_min, col_min, char, DIR) \ No newline at end of file diff --git a/scripts/visualise_benchmark.py b/scripts/visualise_benchmark.py new file mode 100755 index 0000000..0245884 --- /dev/null +++ b/scripts/visualise_benchmark.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +import pandas as pd +from matplotlib import pyplot as plt +import sys +import math + + +def get_params(parameter_file): + f = parameter_file[:-len('.csv')] + f = f[len('data/benchmark/'):] + return [int(x) for x in f.split('_')] + + +def plot_map(axs, f, x, y, label): + axs.plot(list(map(f, x)), list(map(f, y)), label=label) + + +if len(sys.argv) != 2: + print("Expected exactly one argument: ") + sys.exit(1) + +file_name = sys.argv[1] +raw_benchmark_data = pd.read_csv(file_name) + +times = dict() +entries_by_lines = dict() +entries_by_cols = dict() +entries_by_chars = dict() + +for i in range(len(raw_benchmark_data.index)): + row = raw_benchmark_data.iloc[i] + lines, cols, chars = get_params(row['parameter_file']) + entries_by_lines[lines] = entries_by_lines.get(lines, []) + [i] + entries_by_cols[cols] = entries_by_cols.get(cols, []) + [i] + entries_by_chars[chars] = entries_by_chars.get(chars, []) + [i] + times[(lines, cols, chars)] = float(row['mean']) + +default_lines = min(entries_by_lines.keys()) +default_cols = min(entries_by_cols.keys()) +default_chars = min(entries_by_chars.keys()) + +lines = sorted(entries_by_lines.keys()) +times_by_lines = [times[(l, default_cols, default_chars)] for l in lines] + +cols = sorted(entries_by_cols.keys()) +times_by_cols = [times[(default_lines, c, default_chars)] for c in cols] + +chars = sorted(entries_by_chars.keys()) +times_by_chars = [times[(default_lines, default_cols, c)] for c in chars] + +f = lambda x: x # id(x) = x + +fig, axs = plt.subplots() + +fig.set_dpi(150) + +plot_map(axs, f, lines, times_by_lines, "N = Number of lines per file") +plot_map(axs, f, cols, times_by_cols, "N = Number of columns per line") +plot_map(axs, f, chars, times_by_chars, "N = Number of characters per cell") + +plt.xlabel("Problem size N") +plt.ylabel("Time taken in seconds") + +plt.legend() +plt.savefig(f"{'.'.join(file_name.split('.')[:-1])}.png") \ No newline at end of file diff --git a/src/benchmark/generate.c b/src/benchmark/generate.c new file mode 100644 index 0000000..46b9349 --- /dev/null +++ b/src/benchmark/generate.c @@ -0,0 +1,26 @@ +#include +#include +#include + +int main(int argc, char **argv) { + if (argc != 4) { + fprintf(stderr, "Expected 3 argumens, found %d\n", argc); + exit(1); + } + int num_rows = atoi(argv[1]); + int num_cols = atoi(argv[2]); + int len_col = atoi(argv[3]); + size_t len_row = num_cols * (len_col + 1); + char *row_buffer = malloc(len_row * sizeof(char)); + int i, j; + for (i = 0; i < len_row - 1; i += len_col + 1) { + for (j = 0; j < len_col; j++) { + row_buffer[i + j] = 'A'; + } + row_buffer[i + j] = ','; + } + row_buffer[i-1] = '\0'; + for (i = 0; i < num_rows; i++) { + printf("%s\n", row_buffer); + } +} \ No newline at end of file diff --git a/src/config.c b/src/config.c index 091b58b..0583782 100644 --- a/src/config.c +++ b/src/config.c @@ -7,12 +7,12 @@ // Fills the fields of a given Config struct with default values. void initialise_config(struct Config *cfg) { - cfg->file_path = DEFAULT_FILE_PATH; - cfg->new_file_name = DEFAULT_NEW_FILE_NAME; - cfg->exclude_headers = DEFAULT_EXCLUDE_HEADERS; - cfg->include_remainders = DEFAULT_INCLUDE_REMAINDERS; - cfg->delimiter = DEFAULT_DELIMITER; - cfg->line_count = DEFAULT_LINE_COUNT; + cfg->in_file_path = DEFAULT_FILE_PATH; + cfg->out_file_path = DEFAULT_NEW_FILE_NAME; + cfg->do_exclude_headers = DEFAULT_EXCLUDE_HEADERS; + cfg->do_include_remainders = DEFAULT_INCLUDE_REMAINDERS; + cfg->delim = DEFAULT_DELIMITER; + cfg->num_lines = DEFAULT_LINE_COUNT; cfg->remove_columns_l = 0; cfg->remove_columns = NULL; cfg->remove_columns_buffer = NULL; @@ -43,14 +43,14 @@ void process_config(struct Config *cfg) { // Big `if` in case we need to add more processing. if (cfg->remove_columns_buffer != NULL) { cfg->remove_columns_l = - count_char(cfg->remove_columns_buffer, cfg->delimiter) + 1; + count_char(cfg->remove_columns_buffer, cfg->delim) + 1; LOG("Found %lu columns to be removed.\n", cfg->remove_columns_l); cfg->remove_columns = malloc(cfg->remove_columns_l * sizeof(char *)); char *begin, *end; end = begin = cfg->remove_columns_buffer; size_t i; for (i = 0; i < cfg->remove_columns_l - 1; i++) { - while (*end != cfg->delimiter) { + while (*end != cfg->delim) { end++; } add_colum_to_remove(cfg, begin, end, i); @@ -69,7 +69,7 @@ void parse_config(struct Config *cfg, const int argc, char **argv) { for (size_t i = 1; i < argc;) { parse_arg(cfg, argc, argv, &i); } - if (!cfg->file_path) { + if (!cfg->in_file_path) { fprintf(HELP_OUT, "Expected input file. Use --help to learn more.\n"); exit(PARSE_ERR); } diff --git a/src/config.h b/src/config.h index e7c0f2b..aa0f40e 100644 --- a/src/config.h +++ b/src/config.h @@ -4,19 +4,19 @@ #include #include -#define CSV_SPLIT_VERSION "v0.0.2" +#define CSV_SPLIT_VERSION "v0.1.0" struct Config { /* Strings */ - const char *file_path; - const char *new_file_name; + const char *in_file_path; + const char *out_file_path; /* Booleans */ - char exclude_headers; - char include_remainders; + char do_exclude_headers; + char do_include_remainders; /* Other values */ - char delimiter; + char delim; char *remove_columns_buffer; - size_t line_count; + size_t num_lines; size_t remove_columns_l; char **remove_columns; }; @@ -27,7 +27,7 @@ void initialise_config(struct Config *cfg); // Function to parse given command line arguments to cfg fields. void parse_config(struct Config *cfg, const int argc, char **argv); -void process_config(struct Config *config); +void process_config(struct Config *cfg); void print_help(void); diff --git a/src/flags.c b/src/flags.c index 4866237..d0034a8 100644 --- a/src/flags.c +++ b/src/flags.c @@ -63,23 +63,23 @@ static size_t parse_flag_by_index( exit(PARSE_ERR); } arg = argv[arg_at]; - cfg->new_file_name = arg; + cfg->out_file_path = arg; return *at += 2; // Read extra argument. - case EXCLUDE_HEADERS: cfg->exclude_headers = 1; return *at += 1; + case EXCLUDE_HEADERS: cfg->do_exclude_headers = 1; return *at += 1; case LINE_COUNT: - if (at + 1 == argc) { + if (*at + 1 == argc) { ERR_LOG("Expected line count. Use --help to learn more.\n"); exit(PARSE_ERR); } if (!is_natural(argv[arg_at])) { ERR_LOG("Expected valid positive integer as line count.\n"); } - cfg->line_count = atoi(argv[arg_at]); - if (cfg->line_count <= 0) { + cfg->num_lines = atoi(argv[arg_at]); + if (cfg->num_lines <= 0) { ERR_LOG("Line count needs to be greater than zero.\n"); exit(PARSE_ERR); } - LOG("Found line count: %lu\n", cfg->line_count); + LOG("Found line count: %lu\n", cfg->num_lines); return *at += 2; // Read extra argument. case DELIMITER: if (arg_at == argc || @@ -87,10 +87,10 @@ static size_t parse_flag_by_index( ERR_LOG("Expected delimiter. Use --help to learn more.\n"); exit(PARSE_ERR); } - cfg->delimiter = argv[arg_at][0]; + cfg->delim = argv[arg_at][0]; return *at += 2; case REMOVE_COLUMNS: - if (at + 1 == argc) { // Any string will be treated as a file name, as + if (*at + 1 == argc) { // Any string will be treated as a file name, as // lon as it's there. ERR_LOG("Expected file name. Use --help to learn more.\n"); exit(PARSE_ERR); @@ -101,7 +101,7 @@ static size_t parse_flag_by_index( exit(PARSE_ERR); } return *at += 2; - case INCLUDE_REMAINDERS: cfg->include_remainders = 1; return (*at)++; + case INCLUDE_REMAINDERS: cfg->do_include_remainders = 1; return (*at)++; case HELP: print_help(); exit(0); default: exit(PARSE_ERR); } @@ -121,21 +121,21 @@ static int parse_short_flag( size_t *at) { size_t subflag = 1; // First character is -, so first flag char is at 1. size_t start = *at; - size_t tmp_at; + size_t temp_at; char found; do { found = 0; for (struct Flag *f = FLAGS; f < FLAGS + FLAG_COUNT; f++) { if (argv[start][subflag] == f->short_id) { - tmp_at = *at; + temp_at = *at; LOG("Found short flag for %s\n", f->long_id); - parse_flag_by_index(cfg, argc, argv, &tmp_at, f - FLAGS); - if (tmp_at > + parse_flag_by_index(cfg, argc, argv, &temp_at, f - FLAGS); + if (temp_at > start + 1) { // Boolean flags are not allowed after flags // that require a value. (e.g. `-ne ` is illegal) LOG("Last flag was non-boolean.\n"); - return *at = tmp_at; + return *at = temp_at; } found = 1; break; @@ -200,7 +200,7 @@ size_t parse_arg(struct Config *cfg, const int argc, char **argv, size_t *at) { LOG("Parsing argument at %lu\n", *at); if (!is_flag(argv[*at])) { LOG("Found file path\n"); - cfg->file_path = argv[*at]; + cfg->in_file_path = argv[*at]; return (*at)++; } if (!is_long_flag(argv[*at])) { diff --git a/src/flags.h b/src/flags.h index 0aa35ea..939bb6a 100644 --- a/src/flags.h +++ b/src/flags.h @@ -95,8 +95,7 @@ static struct Flag FLAGS[] = { FLAG_INCLUDE_REMAINDERS, FLAG_HELP}; -size_t - parse_arg(struct Config *config, const int argc, char **argv, size_t *at); +size_t parse_arg(struct Config *cfg, const int argc, char **argv, size_t *at); size_t max_flag_length(); diff --git a/src/split.c b/src/split.c index 7b76e74..5f1aabc 100644 --- a/src/split.c +++ b/src/split.c @@ -57,7 +57,7 @@ static void load_headers( } line_len = remove_linebreak(line, line_len); // Counting columns and replacing delim with constant WORKING_DELIM - *len = strsub(line, cfg->delimiter, WORKING_DELIM) + + *len = strsub(line, cfg->delim, WORKING_DELIM) + 1; // +1 because there is one more field than delimiters. // Inserting column headers *headers = malloc(*len * sizeof(char *)); @@ -75,19 +75,19 @@ static void load_headers( } // How many files have been written. -size_t file_count = 0; +size_t num_files = 0; // Removes the columns specified in the CONFIG from the INCLUDE_COLUMN set. static size_t find_relevant_columns( - const struct Config *config, + const struct Config *cfg, const size_t input_length, char **headers, char *include_column) { size_t output_length = input_length; for (size_t i = 0; i < input_length; i++) { include_column[i] = 1; - for (size_t j = 0; j < config->remove_columns_l; j++) { - if (!strcmp(headers[i], config->remove_columns[j])) { + for (size_t j = 0; j < cfg->remove_columns_l; j++) { + if (!strcmp(headers[i], cfg->remove_columns[j])) { include_column[i] = 0; output_length--; break; @@ -101,7 +101,7 @@ static size_t find_relevant_columns( // array containing only those columns that are not to be excluded by the // config. static void filter_line( - const struct Config *config, + const struct Config *cfg, const size_t input_length, // number of columns in input file char **input, // string values for each input column const char *include_column, // whether the ith column should be written to @@ -111,7 +111,6 @@ static void filter_line( if (output_length == input_length) { // If there's nothing to filter, we can // just copy the enitre array. memcpy(output, input, input_length * sizeof(char *)); - LOG("Skipped filtering because input and output sizes are identical.\n"); return; } size_t i, j; @@ -127,9 +126,9 @@ static void filter_line( // Holds memory for the current set of lines that is being processed. struct Batch { - size_t line_count; - size_t column_count; - size_t *line_lengths; + size_t num_lines; + size_t num_cols; + size_t *line_lens; char **lines; char ***values; char *file_name; @@ -139,22 +138,21 @@ struct Batch { // copied so they rely on the line buffer being valid. Additionally, the line // buffer is altered to handle those references. static void load_values( - const struct Config *config, + const struct Config *cfg, char *line, // A line buffer containing comma separated values WITHOUT the // linebreak const size_t input_column_count, const size_t output_column_count, char **values) { - size_t actual_column_count; + size_t actual_num_cols; remove_linebreak(line, strlen(line)); if (input_column_count != - (actual_column_count = - strsub(line, config->delimiter, WORKING_DELIM) + 1)) { + (actual_num_cols = strsub(line, cfg->delim, WORKING_DELIM) + 1)) { fprintf( stderr, "Unexpected number of columns in input. (expected: %lu, found: %lu)\n", input_column_count, - actual_column_count); + actual_num_cols); exit(1); } char *begin, *end, **next_value; @@ -165,51 +163,50 @@ static void load_values( *(next_value++) = begin; begin = end; } - LOG("Wrote %lu values\n", next_value - values); } // Writes a single line to F filled with COLUMN_COUNT fields of VALUES separated // by CONFIG->DELIMITER. static void write_line( - const struct Config *config, + const struct Config *cfg, FILE *f, const size_t column_count, char **values) { fprintf(f, "%s", values[0]); // Having less than one column is impossible. for (size_t i = 1; i < column_count; i++) { - fprintf(f, "%c%s", config->delimiter, values[i]); + fprintf(f, "%c%s", cfg->delim, values[i]); } putc('\n', f); } // Writes OUTPUT to the correct file using CONFIG and HEADERS for formatting. static void write_batch( - const struct Config *config, + const struct Config *cfg, char **headers, struct Batch *output) { - LOG("Writing batch #%lu to file (%s).\n", file_count - 1, output->file_name); + LOG("Writing batch #%lu to file (%s).\n", num_files - 1, output->file_name); FILE *f = fopen(output->file_name, "w+"); if (f == NULL) { ERR_LOG( "An error occured opening or creating file #%lu (%s).\n", - file_count - 1, + num_files - 1, output->file_name); exit(1); } - if (!config->exclude_headers) { + if (!cfg->do_exclude_headers) { LOG("Writing headers.\n"); - write_line(config, f, output->column_count, headers); + write_line(cfg, f, output->num_cols, headers); } LOG("Writing values.\n"); - for (size_t i = 0; i < output->line_count; i++) { - write_line(config, f, output->column_count, output->values[i]); + for (size_t i = 0; i < output->num_lines; i++) { + write_line(cfg, f, output->num_cols, output->values[i]); } fclose(f); } // Reads the next set of lines from the input and processes them. static void process_batch( - const struct Config *config, + const struct Config *cfg, FILE *file, const size_t input_column_count, const char *include_column, @@ -217,45 +214,43 @@ static void process_batch( struct Batch *output) { // Buffer that holds all the necessary information // for the current set of lines. LOG("Processing batch.\n"); - char *line; - size_t len; - size_t i; + char **line_ptr; + size_t *len_ptr, i; ssize_t read; - char *value_buffer[output->column_count]; - sprintf(output->file_name, "%s%lu.csv", config->new_file_name, file_count++); - for (i = 0; i < config->line_count; i++) { - line = (output->lines)[i]; - len = (output->line_lengths)[i]; - read = getline(&line, &len, file); + char *value_buffer[output->num_cols]; + sprintf(output->file_name, "%s%lu.csv", cfg->out_file_path, num_files++); + for (i = 0; i < cfg->num_lines; i++) { + line_ptr = output->lines + i; + len_ptr = output->line_lens + i; + read = getline(line_ptr, len_ptr, file); if (read == -1) { - if (config->include_remainders) { + if (cfg->do_include_remainders) { LOG("Writing remainders\n"); - output->line_count = i; - write_batch(config, headers, output); + break; } return; } load_values( - config, - line, + cfg, + *line_ptr, input_column_count, - output->column_count, + output->num_cols, value_buffer); filter_line( - config, + cfg, input_column_count, value_buffer, include_column, - output->column_count, + output->num_cols, output->values[i]); } - output->line_count = i; - write_batch(config, headers, output); + output->num_lines = i; + write_batch(cfg, headers, output); } // Given a new BATCH this function initialises its values to be ready for use. static void initialise_batch( - const struct Config *config, + const struct Config *cfg, struct Batch *batch, const size_t max_lines, const size_t cols) { @@ -264,31 +259,32 @@ static void initialise_batch( // memory. batch->lines = malloc(max_lines * sizeof(char *)); LOG("Allocating values\n"); - batch->values = malloc(max_lines * sizeof(char **)); - batch->line_lengths = malloc(max_lines * sizeof(size_t)); + batch->values = malloc(max_lines * sizeof(char **)); + batch->line_lens = malloc(max_lines * sizeof(size_t)); batch->file_name = - malloc(strlen(config->new_file_name) + FILE_NAME_SUFFIX_BUFFER); + malloc(strlen(cfg->out_file_path) + LEN_FILE_NAME_SUFFIX_BUFFER); for (char ***p = batch->values; p - batch->values < max_lines; p++) { - LOG("Allocating sub_values\n"); *p = malloc(cols * sizeof(char *)); } - for (size_t *q = batch->line_lengths; q - batch->line_lengths < max_lines; - q++) { - *q = 0; + for (size_t *q = batch->line_lens; q - batch->line_lens < max_lines; q++) { + *q = LEN_INITIAL_LINE_BUFFER; + } + for (char **r = batch->lines; r - batch->lines < max_lines; r++) { + *r = malloc(LEN_INITIAL_LINE_BUFFER * sizeof(char)); } } - batch->line_count = 0; - batch->column_count = cols; + batch->num_lines = 0; + batch->num_cols = cols; } // Splits a file by lines and writes them to outputs as specified in CFG. void split_csv(const struct Config *cfg) { LOG("Splitting file\n"); - if (access(cfg->file_path, F_OK) == -1) { - fprintf(stderr, "File does not exist. (%s)\n", cfg->file_path); + if (access(cfg->in_file_path, F_OK) == -1) { + fprintf(stderr, "File does not exist. (%s)\n", cfg->in_file_path); exit(EXIT_FAILURE); } - FILE *f = fopen(cfg->file_path, "r"); + FILE *f = fopen(cfg->in_file_path, "r"); // Processing file header. // TODO: Include option to process files without headers. char **input_headers = NULL; @@ -312,7 +308,7 @@ void split_csv(const struct Config *cfg) { output_length); struct Batch output_buffer = {0, 0, NULL, NULL, NULL}; do { - initialise_batch(cfg, &output_buffer, cfg->line_count, output_length); + initialise_batch(cfg, &output_buffer, cfg->num_lines, output_length); process_batch( cfg, f, @@ -320,5 +316,5 @@ void split_csv(const struct Config *cfg) { include_column, output_headers, &output_buffer); - } while (output_buffer.line_count == cfg->line_count); + } while (output_buffer.num_lines == cfg->num_lines); } \ No newline at end of file diff --git a/src/split.h b/src/split.h index 39812b5..d2011f4 100644 --- a/src/split.h +++ b/src/split.h @@ -1,7 +1,8 @@ #ifndef SPLIT_H #define SPLIT_H -#define FILE_NAME_SUFFIX_BUFFER 128 +#define LEN_FILE_NAME_SUFFIX_BUFFER 128 +#define LEN_INITIAL_LINE_BUFFER 1024 #include "config.h"