Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2010 23:32:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

o7412369815963
Zubchick
питончую сортировку слияниями :) http://algolist.manual.ru/sort/faq/q10.php

или сильно оптимизированный вариант, но более сложная реализация http://algolist.manual.ru/sort/faq/q13.php
туфта и надувательство, эта ф-ия не делает ничего:
list-type mergesort (list-type L; int n)  { 
if (n = 1) return (L) else {
разделить L на две половины L1 и L2;
return (merge (mergesort (L1,n/2), mergesort (L2,n/2)) );
}
}
merge() - функция слияния.
и пример там не рабочий
merge() - функция слияния. - это не просто слияние, но и по сути сортировка, тогда все работает.

Офлайн

#2 Окт. 22, 2010 10:47:15

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

o7412369815963
o7412369815963
Zubchick
питончую сортировку слияниями :) http://algolist.manual.ru/sort/faq/q10.php

или сильно оптимизированный вариант, но более сложная реализация http://algolist.manual.ru/sort/faq/q13.php
туфта и надувательство, эта ф-ия не делает ничего:
list-type mergesort (list-type L; int n)  { 
if (n = 1) return (L) else {
разделить L на две половины L1 и L2;
return (merge (mergesort (L1,n/2), mergesort (L2,n/2)) );
}
}
merge() - функция слияния.
и пример там не рабочий
merge() - функция слияния. - это не просто слияние, но и по сути сортировка, тогда все работает.
Вот в качестве примера сортировки файла с 1000 чисел типа double(сортировка слиянием, как описано тут http://algolist.manual.ru/sort/faq/q10.php) :

import time

def merge(left, right):
result =
i ,j = 0, 0
while i < len(left) and j < len(right):
if left <= right:
result.append(left)
i += 1
else:
result.append(right)
j += 1
result += left
result += right
return result

def mergesort(list):
if len(list) < 2:
return list
else:
middle = len(list) / 2
left = mergesort(list)
right = mergesort(list)
return merge(left, right)

def main():
t = time.time()
print ‘starting at %s’ % t

name = ‘1.txt’ #файл с 1000 строк их чисел
NUMS = #тут будет храниться отсортированный список
with open(name, “r”) as f:
for line in f:
NUMS.append(float(line.rstrip()))
print mergesort(NUMS)
basetime = time.time() - t #вычисляем время работы сортировки
print ‘file was sorted in %s secs’ % basetime

if __name__ == “__main__”:
main()



Офлайн

#3 Окт. 22, 2010 10:50:06

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

А кого нить есть пример (на python) многофазной сортировки слиянием для файлов? Теория есть и пример на С тоже (тут http://algolist.manual.ru/sort/faq/q13.php), но все же, если у кого нить есть пример на python поделитесь, пожалуйста?



Офлайн

#4 Окт. 22, 2010 20:39:04

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

по-моему с такими объемами лучше субд использовать



Офлайн

#5 Окт. 22, 2010 21:30:48

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

pasaranax
по-моему с такими объемами лучше субд использовать
Хорошо, допустим СУБД. Предложите, пожалуйста, свой вариант на MySQL к примеру.



Офлайн

#6 Окт. 22, 2010 23:18:49

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

Ну вот как-то так:

# -*- coding: utf-8 -*-

import MySQLdb

db = MySQLdb.Connect(user='root', passwd='111', db='test')
cur = db.cursor()

numbers = open('numbers.txt')
cur.execute('TRUNCATE TABLE `numbers`')
cur.executemany('INSERT INTO `numbers` SET `number`=%s', numbers)

numbers_sorted = open('numbers_sorted.txt', 'w+')
cur.execute('SELECT `number` FROM `numbers` ORDER BY `number`')
for row in cur.fetchall():
numbers_sorted.write(str(row[0]) + '\n')
таблица:
CREATE TABLE `numbers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`number` double DEFAULT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



Отредактировано (Окт. 23, 2010 04:33:34)

Офлайн

#7 Окт. 22, 2010 23:24:43

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

радикально…



Офлайн

#8 Окт. 23, 2010 10:58:08

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

esal
А кого нить есть пример (на python) многофазной сортировки слиянием для файлов?
Вот нечто похожее от автора языка:
http://neopythonic.blogspot.com/2008/10/sorting-million-32-bit-integers-in-2mb.html



Офлайн

#9 Окт. 23, 2010 17:06:25

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

сортировка большого объема данных в текстовом файле

отсортировал через mysql миллион значений за 233 секунды, значит миллиард получится за 64 часа =D



Офлайн

#10 Окт. 23, 2010 20:29:43

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

сортировка большого объема данных в текстовом файле

Получится дольше - зависимость нелинейная.
“Классический” вариант - многопутевое слияние предварительно отсортированных небольших кусочков, насколько я это себе представляю.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version