Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35

Реально ли переписать код Python на C#?

29.10.2023, 23:10. Показов 2367. Ответов 37

Студворк — интернет-сервис помощи студентам
Есть реализация бинарного поиска по файлу (код не мой):
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import mmap
import os
import sys
 
def binarySearch(mm, l, r, x, size):
    eol_bytes = os.linesep.encode()
    x = x.encode()
    while l <= r:
        mid = l + (r - l)//2
        prev_eol = mm.rfind(eol_bytes, 0, mid + len(eol_bytes))
        if prev_eol == -1: prev_eol = 0
        next_eol = mm.find(eol_bytes, mid + 1)
        if next_eol == -1: next_eol = size
        pos = prev_eol+len(eol_bytes) if eol_bytes == mm[prev_eol:prev_eol+len(eol_bytes)] else prev_eol
        mid_slice = mm[pos:next_eol]
        if mid_slice == x:
            return pos
        elif mid_slice < x:
            l = next_eol + len(eol_bytes)
        else:
            r = prev_eol
    return -1
 
with open('file.txt', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 0)
    f.seek(0, os.SEEK_END)
    size = f.tell()
    result = binarySearch(mm, 0, size, 'Hello', size)
    if result != -1:
        print("Element is present at index % d" % result)
    else:
        print("Element is not present in array")
 
input()

Код работает супер быстро (что для единоразового поиска, что в цикле; я использовал файлы размером до 2,5Гб), при этом потребление оперативной памяти не превышает 30Мб.

Кто-то сможет переписать код на C#? Просто я новичок и мне такая задача не по зубам)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2023, 23:10
Ответы с готовыми решениями:

Переписать код на Python
Помогите пожалуйста Как переделать этот код в код на Python? #include &lt;bits/stdc++.h&gt; using namespace std; int main() { ...

Переписать код c Python
Уважаемые программисты Python. Мне требуется переписать код программы с python на другой язык программирования. С этим языком (Python) я...

Переписать код С++ в Python
#ifndef __PWLH_CPP #define __PWLH_CPP #include &quot;../../../stdafx.h&quot; #include &quot;PWLH.h&quot; #include &quot;LinearBucket.h&quot; // Add ----&gt;...

37
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
30.10.2023, 09:44  [ТС]
Студворк — интернет-сервис помощи студентам
URUSOFF, Хмм, я попробовал сначала на ооочень маленьком файле, и это работало. Но сейчас, при использовании большого файла, ваш код не работает, вообще никакую строку найти не может(

kotelok, А я вытяну одну плашку ОЗУ, думаю 4 Гб ОЗУ для тестов пойдет? (Винда 10 64bit)
0
Заблокирован
30.10.2023, 09:54
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        string path = "testdata.txt";
        string target = "искомаяСтрока";
 
        using (var mmf = MemoryMappedFile.CreateFromFile(path))
        {
            using (var accessor = mmf.CreateViewAccessor())
            {
                long size = new FileInfo(path).Length;
                long result = BinarySearch(accessor, 0, size, target);
 
                if (result != -1)
                {
                    Console.WriteLine($"Элемент найден на позиции {result}");
                }
                else
                {
                    Console.WriteLine("Элемент не найден в файле");
                }
            }
        }
    }
 
    static long BinarySearch(MemoryMappedViewAccessor accessor, long left, long right, string target)
    {
        byte[] targetBytes = Encoding.UTF8.GetBytes(target);
 
        while (left <= right)
        {
            long mid = left + (right - left) / 2;
            byte[] midBytes = new byte[targetBytes.Length];
            accessor.ReadArray(mid, midBytes, 0, midBytes.Length);
 
            int comparison = CompareArrays(midBytes, targetBytes);
 
            if (comparison == 0)
            {
                return mid;
            }
            else if (comparison < 0)
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
 
        return -1;
    }
 
    static int CompareArrays(byte[] a1, byte[] a2)
    {
        int length = Math.Min(a1.Length, a2.Length);
 
        for (int i = 0; i < length; i++)
        {
            if (a1[i] < a2[i]) return -1;
            if (a1[i] > a2[i]) return 1;
        }
 
        if (a1.Length < a2.Length) return -1;
        if (a1.Length > a2.Length) return 1;
 
        return 0;
    }
}
1
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
30.10.2023, 10:13  [ТС]
URUSOFF, Неа, не работает. Даже не знаю почему(
Но код Someone007 работает прекрасно и быстрее на одну секунду (проводил тесты).
Думаю тему можно закрывать)
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
30.10.2023, 10:21
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Но код Someone007 работает прекрасно
Но загружает файл в память (хоть и без привязки именно к вашему процессу).
0
Заблокирован
30.10.2023, 10:32
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Думаю тему можно закрывать)
ок, нет проблем
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
30.10.2023, 13:30  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
хоть и без привязки именно к вашему процессу
Сейчас запущу прогу на компе с 4 ГБ ОЗУ. Если действительно загружает, то памяти физически не хватит

Добавлено через 2 часа 53 минуты
Потерь скорости почти нету, я даже удивлён. Я запустил игру на компьютере, которая сожрала большую часть ОЗУ (так как на компе всего 4 Гб + потребление винды), но программа продолжила работать как часы. Я удовлетворен результатом. Всем спасибо!)

Добавлено через 3 минуты
Кстати, кто-то знает как можно отсортировать строки в алфавитном порядке в большом файле?
Если я беру файл размером от 3 Гб, Sublime Text не справляется, даже 16 Гб ОЗУ не хватает...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
30.10.2023, 13:53
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Кстати, кто-то знает как можно отсортировать строки в алфавитном порядке в большом файле?
Я так сортировал, но жрет много памяти и долго сортирует...
C#
1
2
var lines = File.ReadLines("e:\\testdata.txt");
File.WriteAllLines("e:\\testdata_sorted.txt", lines.OrderBy(x => x));
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
30.10.2023, 16:00
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Если я беру файл размером от 3 Гб, Sublime Text не справляется, даже 16 Гб ОЗУ не хватает...
ждем появление темы "как отсортировать большой файл..." XD

Если серьезно: дробить на меньшие, сортировать их, а потом мержить обратно путем "считал из каждого по строке, сравнил, записал нужную". Ну либо один раз заготовить по примеру Someone007, и надеяться что больше менять не нужно будет (учитывая что вы до этого использовали Sublime Text, подозреваю что это ваш случай).
1
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 01:19  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
ждем появление темы "как отсортировать большой файл..." XD
Та не, уже как-то сам справлюсь)
Цитата Сообщение от Wolfdp Посмотреть сообщение
дробить на меньшие
Так и сделаю. Ещё раз спасибо абсолютно всем пользователям этой темы
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 10:39  [ТС]
Someone007, тут такое дело . . .
А бинарный поиск может выполняться по файлу с строками разной длины?

И оставляю источик кода на питоне (там вроде есть реализация как раз таки определения конца строки):
Code
1
2
https://ru_stackoverflow_com/questions/1289511
Символ "_" на точку измените
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
31.10.2023, 10:59
Цитата Сообщение от Evil12Boy Посмотреть сообщение
А бинарный поиск может выполняться по файлу с строками разной длины?
Может конечно, тут нет нигде привязки к длине строки...
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 11:25  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Может конечно, тут нет нигде привязки к длине строки...
Странно, у меня выбивает ошибку: "Specified argument was out of the range of valid values" в методе GetSpan, последняя строка (return).

Добавлено через 3 минуты
Цитата Сообщение от Someone007 Посмотреть сообщение
но только если в файле все строки в нижнем регистре
Тоже заметил такую проблему ...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
31.10.2023, 11:30
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Странно, у меня выбивает ошибку: "Specified argument was out of the range of valid values" в методе GetSpan, последняя строка (return).
Похоже что длина строки неверно вычисляется...

Цитата Сообщение от Evil12Boy Посмотреть сообщение
Тоже заметил такую проблему ...
Мне кажется это из-за неправильной сортировки...

Попробуйте так отсортировать:
C#
1
2
var lines = File.ReadLines("e:\\testdata.txt");
File.WriteAllLines("e:\\testdata_sorted.txt", lines.OrderBy(x => x, StringComparer.Ordinal));
вроде после этого поиск работает даже если в строках разный регистр...
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 11:55  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
вроде после этого поиск работает даже если в строках разный регистр...
Да, действительно работает)

Добавлено через 16 минут
Цитата Сообщение от Someone007 Посмотреть сообщение
Попробуйте так отсортировать:
Даже файл размером в 2Гб отсортировал, отлично!
Sublime Text не справлялся с этим)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
31.10.2023, 12:09
Цитата Сообщение от Evil12Boy Посмотреть сообщение
Даже файл размером в 2Гб отсортировал, отлично!
Я 4ГБ так сортировал успешно, больше не пробовал...

Цитата Сообщение от Evil12Boy Посмотреть сообщение
Странно, у меня выбивает ошибку: "Specified argument was out of the range of valid values" в методе GetSpan, последняя строка (return).
Попробуйте строку
C#
1
long nextEol = accessor.Find(eolBytes, mid + 1);
заменить на
C#
1
long nextEol = accessor.Find(eolBytes, mid + eolBytes.Length);
Не знаю как это повлияет на корректность работы алгоритма, но вроде ошибка исчезает...
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 12:15  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Не знаю как это повлияет на корректность работы алгоритма, но вроде ошибка исчезает...
Работает!
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
31.10.2023, 12:38
На самом деле там проблема в методах RFind/Find, они работают не идентично питоновским, поэтому и возникает ошибка...

Добавлено через 4 минуты
Весь код можно было бы сильно упростить, если бы Span поддерживал длину в long вместо int... Там есть реализации нужных методов поиска, но длина Span ограничена int, т.е. 2 ГБ...
0
 Аватар для Evil12Boy
0 / 0 / 0
Регистрация: 25.10.2023
Сообщений: 35
31.10.2023, 12:38  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
На самом деле там проблема в методах RFind/Find, они работают не идентично питоновским, поэтому и возникает ошибка...
Ну скорость поиска предостаточная, ОЗУ отдыхает, ваш метод сортировки тоже работает отлично, даже поиск с строками разной длины работает на ура! Я доволен, не устану благодарить всех пользователей этого прекрасного форума))

Цитата Сообщение от Someone007 Посмотреть сообщение
Span ограничена int
Да, только что прочитал про это в интернете, очень жаль кнш
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2023, 12:38

Переписать код С++ в Python
#ifndef __APCA_CPP #define __APCA_CPP #include &quot;../../../stdafx.h&quot; #include &quot;APCA.h&quot; APCA::APCA(APCAInput* pInput) { ...

Переписать код C# на Python
namespace Project1 { class Лампа { private static string Тип_лампы1 = &quot;Лампа накаливания:&quot;; private static string...

Переписать код с Python на C++
Переписать код с Python на C++ Прошу помогите переписать код с Python на С++, очень срочно!!! n = int(input()) s = list(map(int,...

Переписать код из Python в С
str = raw_input() def rec(i, depth): if i &lt; len(str): c = str cnt = 0 if c == '(' or c == '?': cnt +=...

Переписать код C++ в Python
#include &lt;iostream&gt; using namespace std; const int MAX_POINTS = 20; int x_intersect(int x1, int y1, int x2, int y2, int x3,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru