Мой код Python заканчивается с нехваткой памяти из-за большого количества строк в файлах,

С помощью Java 8 вы можете сделать что-то подобное с помощью всех обычных методов:

Object returnValue = TimeIt.printTime(() -> methodeWithReturnValue());
//do stuff with your returnValue

с TimeIt like:

public class TimeIt {

public static <T> T printTime(Callable<T> task) {
    T call = null;
    try {
        long startTime = System.currentTimeMillis();
        call = task.call();
        System.out.print((System.currentTimeMillis() - startTime) / 1000d + "s");
    } catch (Exception e) {
        //...
    }
    return call;
}
}

С помощью этого метода вы можете легко провести время измерения в любом месте вашего кода, не нарушая его. В этом простом примере я просто распечатываю время. Можно добавить переключатель для TimeIt, например. чтобы печатать только время в DebugMode или что-то в этом роде.

Если вы работаете с Function, вы можете сделать что-то вроде этого:

Function<Integer, Integer> yourFunction= (n) -> {
        return IntStream.range(0, n).reduce(0, (a, b) -> a + b);
    };

Integer returnValue = TimeIt.printTime2(yourFunction).apply(10000);
//do stuff with your returnValue

public static <T, R> Function<T, R> printTime2(Function<T, R> task) {
    return (t) -> {
        long startTime = System.currentTimeMillis();
        R apply = task.apply(t);
        System.out.print((System.currentTimeMillis() - startTime) / 1000d
                + "s");
        return apply;
    };
}
0
задан James Z 16 January 2019 в 14:40
поделиться

2 ответа

Вы проверили опцию "chunksize" для фрейма данных? Он используется для разбиения больших наборов данных на более мелкие, если они не помещаются в память - вот хорошее объяснение, где они хотят прочитать данные 10G + в кадр данных: http://acepor.github.io/2017/ 08/03 / с использованием-chunksize / .

Вы можете попробовать приведенный ниже код, но я думаю, что вам нужно, чтобы read_csv сначала работал для вашего конкретного формата файла, и выяснил имена / номера столбцов. Вы также можете настроить размер куска; чем больше, тем быстрее. Это все равно будет идти медленно, так как это вложенный цикл.

import pandas as pd
import numpy as np

outfile = 'tab1_tab2_match.dat'
df1 = pd.read_csv('tab1.dat', encoding='ascii', chunksize=1)

col1 = 0
col1_1 = 1

col2 = 0
col2_1 = 1

writeheader= True
mode = 'w'

for cm in df1:
    df2 = pd.read_csv('tab2.dat', encoding='ascii', chunksize=100000)
    for chunk in df2:
        chunk.columns = ['col2', 'col2_1' ]
        chunk['del1'] = np.abs(chunk.iloc[:, col1] - cm.iloc[0, col1_1])
        chunk['del2'] = np.abs(chunk.iloc[:, col2] - cm.iloc[0, col2_1])
        chunk['dist'] = np.sqrt((chunk['del1'] * np.cos(chunk['del2'])) ** 2 + chunk['del2'] ** 2)

        tmp = chunk[chunk['dist'] <= 0.00008333]
        tmp['col1', 'col1_2'] = cm.iloc[0, [col1, col1_1]]
        tmp = tmp ['']

        tmp['col2', 'col2_1', 'col1', 'col2_1'].to_csv(outfile, mode=mode, header=writeheader)
        mode = 'a'
        writeheader = False
0
ответ дан Michael Myers 16 January 2019 в 14:40
поделиться

Производительность, вот в чем проблема с циклами и Python. Я предлагаю вам изменить свой метод. У вас есть два входных кадра данных: -table (col1 col2) -table1 (col1_1 col2_1)

Вы хотите вычесть col1 с col1_1, col2 с col2_1 и сравнить значения с порогом d и добавить 4 столбца внутри выходной фрейм данных.

Вот метод без зацикливания, и панды

import pandas as pd 

table = pd.DataFrame(data= {'col1': [1, 2,3,4,5], 'col2': [6,7,8,9,10]})
table1 = pd.DataFrame(data= {'col1_1': [0.5, 0.2,0.3,0.9,0.9], 'col2_1': [5.1,5.2,4.5,5.4,8.5]})

print(table)
print(table1)
   col1  col2
0     1     6
1     2     7
2     3     8
3     4     9
4     5    10
   col1_1  col2_1
0     0.5     5.1
1     0.2     5.2
2     0.3     4.5
3     0.9     5.4
4     0.9     8.5


## 1. Join the 2 tables 
join = table.join(table1)
print(join)
   col1  col2  col1_1  col2_1
0     1     6     0.5     5.1
1     2     7     0.2     5.2
2     3     8     0.3     4.5
3     4     9     0.9     5.4
4     5    10     0.9     8.5



## 2. create a new columns with substraction 
join["del1"] = abs(join['col1'] - join['col1_1'])
join["del2"] = abs(join['col2'] - join['col2_1'])
print(join)
   col1  col2  col1_1  col2_1  del1  del2
0     1     6     0.5     5.1   0.5   0.9
1     2     7     0.2     5.2   1.8   1.8
2     3     8     0.3     4.5   2.7   3.5
3     4     9     0.9     5.4   3.1   3.6
4     5    10     0.9     8.5   4.1   1.5



## 3. filter with threshold 
d = 2 
final_df = join[(join.del1 < d) & (join.del2 <d)]
print(final_df)
   col1  col2  col1_1  col2_1  del1  del2
0     1     6     0.5     5.1   0.5   0.9
1     2     7     0.2     5.2   1.8   1.8
0
ответ дан SimbaPK 16 January 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: