DASK - чтение огромного CSV и запись в 255 различных CSV-файлов - PullRequest
0 голосов
/ 15 марта 2019

Я использую DASK для чтения CSV-файла размером около 2 ГБ.Я хочу записать каждую строку в отдельные файлы CSV из 255 чисел на основе некоторой хэш-функции, как показано ниже.

Мое наивное решение:

from dask import dataframe as dd

if __name__ == '__main__':
    df = dd.read_csv('train.csv', header=None, dtype='str')
    df = df.fillna()
    for _, line in df.iterrows():
        number = hash(line[2]) % 256
        with open("{}.csv".format(number), 'a+') as f:
            f.write(', '.join(line))

Этот способ занимает около 15 минут.Есть ли способ, которым мы можем сделать это быстрее.

1 Ответ

2 голосов
/ 18 марта 2019

Поскольку в вашей процедуре преобладает IO, очень маловероятно, что в этом случае Dask сделает что-либо, кроме добавления накладных расходов, , если ваша хеш-функция действительно очень медленная.Я предполагаю, что это не так. Решение

@ zwer будет выглядеть примерно так:

files = [open("{}.csv".format(number), 'a+') for number in range(255)]
for _, line in df.iterrows():
    number = hash(line[2]) % 256
    files[number].write(', '.join(line))
[f.close() for f in files]

Однако ваши данные, похоже, помещаются в память, поэтому вы можете найти гораздо лучшую производительность

for (number, group) in df.groupby(df.iloc[:, 2].map(hash)):
    group.to_csv("{}.csv".format(number))

, потому что вы пишете в каждый файл непрерывно, а не между ними.В зависимости от вашего устройства ввода-вывода и буферизации, разница может быть нулевой или огромной.

...