A
AllenaAston
Original poster
Ребятки, кто-то тут написал подобное на дельфи, я ради интереса написал такое же самое на питоне.
Должно есть базы любого размера, память не нагружать, работает в 1 поток.
Использовать так:
python split_base.py base_name.txt 50000
где base_name.txt - путь к базе, а 50000 - количество строк на сколько надо разделить базу.
split_base.py
utils.py - декоратор замера скорости работы
Скопипастите файлики в split_base.py и utils.py соответственно.
Ну или скачайте:
Готов ответить на любые вопросы по работе скрипта.
Должно есть базы любого размера, память не нагружать, работает в 1 поток.
Использовать так:
python split_base.py base_name.txt 50000
где base_name.txt - путь к базе, а 50000 - количество строк на сколько надо разделить базу.
split_base.py
Код:
# *-* coding: utf-8 *-*
import os
import sys
from itertools import chain, islice
try:
from utils import timeit
from memory_profiler import profile
except Exception:
timeit = lambda x: x
profile = lambda x: x
# На сколько разделять линий по умолчанию
SPLIT_LINES = 100000
def lines_count(file):
with open(file, 'r') as f:
return len(f.readlines())
@profile
def file_info(filename):
filesize = os.stat(filename).st_size / 1048576
print("Имя базы: %s" % filename)
print("Размер базы: %.2f MB" % filesize)
if filesize < 100:
filelines = lines_count(filename)
print("Количество строк: %d" % filelines)
def chunks(iterable, n):
iterable = iter(iterable)
while True:
yield chain([next(iterable)], islice(iterable, n-1))
def split_file(file, line_num):
with open(file) as bigfile:
for i, lines in enumerate(chunks(bigfile, line_num)):
file_split = '{}_{}.txt'.format(file[:-4], i)
with open(file_split, 'w') as f:
f.writelines(lines)
@timeit
def main():
global SPLIT_LINES
if len(sys.argv) > 1:
filename = sys.argv[1]
else:
print('Не указан путь к базе')
exit()
if len(sys.argv) > 2:
SPLIT_LINES = sys.argv[2]
file_info(filename)
split_file(filename, SPLIT_LINES)
if __name__ == '__main__':
main()
utils.py - декоратор замера скорости работы
Код:
import time
def timeit(f):
def timed(*args, **kw):
ts = time.time()
result = f(*args, **kw)
te = time.time()
print('func:%r args:[%r, %r] took: %2.4f sec' % \
(f.__name__, args, kw, te-ts))
return result
return timed
Скопипастите файлики в split_base.py и utils.py соответственно.
Ну или скачайте:
Для просмотра содержимого вам необходимо авторизоваться.
Готов ответить на любые вопросы по работе скрипта.