Пример точного количества строк из файлов CSV с помощью Dask - PullRequest
1 голос
/ 04 марта 2020

Я хочу создать подвыборку из n строк, используя Dask. Я попробовал 2 подхода:

1.Использование frac:

import dask.dataframe as dd    
read_path = ["test_data\\small1.csv", "test_data\\small2.csv", "huge.csv"]
df = dd.read_csv(read_path)
df = df.sample(frac=0.0001)
df = df.compute()

Это работает достаточно быстро - выберите 10000 из набора данных 100mil в течение 16 секунд. Но он не может гарантировать точное количество строк - он будет округлен из-за использования frac.

2.Используется для l oop:

nrows = 10000
res_df = []
length = csv_loader.get_length()
total_len = sum(length)
start = perf_counter()
inds = random.sample(range(total_len), total_len - nrows - len(length))
min_bound = 0
relative_inds = []
for leng in length:
    relative_inds.append(
        sorted([i - min_bound for i in inds if min_bound <= i < min_bound + leng])
    )
    min_bound += leng
for ind, fil in enumerate(read_path):
    res_df.append(dd.read_csv(fil, skiprows=relative_inds[ind], sample=1000000))

Здесь я вычисляю индексы строк, которые мне нужно пропустить, а затем загружаю из csv, используя skiprows. Этот метод очень медленный и иногда дает сбой, если мне нужно прочитать 0 строк из небольшого csv. Но это гарантирует точное количество строк.

Есть ли какое-то быстрое решение для получения точного количества строк с использованием Dask?

1 Ответ

0 голосов
/ 04 марта 2020

Я нашел решение:

total_len = get_total_length() #compute len of all data in csvs
frac = nrows / total_len

while int(total_len * frac) != nrows:
    counter = 1
    frac = nrows / (total_len - counter)
    counter += 1

    res_df = dd.read_csv(read_path)
    res_df = res_df.sample(frac=0.0001)
    res_df = res_df.compute()

Вы можете посмотреть, как эффективно подсчитать количество строк при посещении csv следующая ссылка .

...